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");
}
这是输出:
编辑:我用开罗表面做过。这是我使用的代码: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");
}
答案 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值。