2016-10-08 110 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