2016-10-08 51 views
1

如何將當前窗口保存爲圖像文件,如png?使用gtk將當前窗口保存爲圖像#

我知道我可以從當前窗口獲取gdkWindow。 我甚至可以得到一個圖像。從這個圖像結構我甚至可以查詢每個像素。但根據我的理解,我真正需要的是獲得pixbuf。

int width; 
int height; 
this.GetSize(width, height); 
this.GdkWindow.GetImage(0,0,width,height).? 

我如何從一個 GTK窗口或 一個GDK窗口或 一個GDK圖像的pixbuf?

編輯

int width; 
int height; 
this.GetSize(out width, out height); 
Pixbuf pixbuf = Pixbuf.FromDrawable (this.GdkWindow, this.Colormap, 0, 0, 0, 0, width, height); 
pixbuf.Save("/tmp/out.png","png"); 

是有點兒工作。一個PNG導出的大小正確但模糊。

編輯2

該解決方案正在工作。該bluriness是侏儒的圖像瀏覽器的漏洞

+0

你使用的是GTK + 2還是3? – oldtechaa

+0

我會說2作爲gtk-sharp版本是2.12.0.0 – frenchone

回答

0

使用gdk_pixbuf_get_from_drawable如果你想保存到文件中使用gdk_pixbuf_saveGdkWindow得到一個GdkPixbuf,然後。

在開羅,這是更面向未來的方法,你可以使用cairo_image_surface_create,將結果傳遞給cairo_create,傳遞到gdk_cairo_set_source_window,複製到你的圖像表面cairo_paint,並與cairo_surface_write_to_png寫你的形象。

另請注意,您的問題與this one類似。然而,由於這個問題的答案不起作用,如果我的答案回答你的問題,我會把另一個問題作爲這個問題的一個補充。

+1

在你調用'cairo_surface_write_to_png'之前,請確保你調用['cairo_paint'](https://www.cairographics.org/manual/cairo-cairot .html#cairo-paint)放在你的'cairo_t'上。 – Jason

+0

謝謝@Jason。我很樂意承認我沒有測試任何這個答案,實際上我沒有使用GDK pixbufs或Cairo圖像後端的經驗。我只知道GTK和Cairo文檔的全部。我想你的建議電話有一點必要,不是嗎? (好事OP沒有用開羅:)) – oldtechaa

相關問題