如何获取Gtk窗口的PNG(alpha通道)屏幕截图?

时间:2012-03-28 00:53:04

标签: mono gtk pygtk cairo pycairo

Gtk windows使用Cairo支持透明度。我尝试使用代码here获取屏幕截图。但它为使用透明度的窗户打印纯黑色。如何制作截图(PNG)以截取Alpha通道呢?

编辑:我尝试使用alpha pixbuf,但输出仍然没有alpha。这是我的代码(唱Gtk#,但它与C完全相同):

static void GetScreenshot(Gtk.Window win) {
    var pixbuf = new Gdk.Pixbuf(Gdk.Colorspace.Rgb, true, 8, 500, 500);
    var pix = pixbuf.GetFromDrawable(win.GdkWindow, win.Colormap, 0, 0, 0, 0, 500, 500);    

    pix.Save("/home/blez/Desktop/screenshot.png", "png");
} 

这是输出: enter image description here

编辑:我用开罗表面做过。这是我使用的代码:

static void GetScreenshot(Gtk.Window win) {
    var src_context = Gdk.CairoHelper.Create(win.GdkWindow);
    var src_surface = src_context.Target;
    var dst_surface = new Cairo.ImageSurface(Cairo.Format.ARGB32, win.Allocation.Width, win.Allocation.Height);
    var dst_context = new Cairo.Context(dst_surface);
    dst_context.SetSourceSurface(src_surface, 0, 0);
    dst_context.Paint();
    dst_surface.WriteToPng("screenshot.png");   
}

2 个答案:

答案 0 :(得分:2)

在您的示例中,答案取决于gdk_pixbuf_get_from_drawable来电。文档明确地说:

  

如果指定的目标pixbuf dest为NULL,则此函数将创建一个RGB pixbuf,每个通道8位且没有alpha,具有由width和height参数指定的相同大小。在这种情况下,dest_x和dest_y参数必须指定为0. 如果指定的目标pixbuf不是NULL并且它包含alpha信息,则填充的像素将设置为完全不透明度(alpha = 255)

所以我认为将带有alpha通道的pixbuf作为第一个参数传递就足够了。

另一种方法是使用cairo API,它可以与GTK 2和GTK 3一起使用。

答案 1 :(得分:0)

...以及你想要一个alpha chanel in

var pixbuf = new Gdk.Pixbuf(Gdk.Colorspace.Rgb, true, 8, 500, 500);  ?

如果它具有透明度(真实的那个)则为rgba。但是你可能仍然遇到窗口管理器的问题,如果它不是合成但是通过混合图像模仿它,将返回黑色(0)而不是颜色/ alpha值。