2012-03-28 48 views
1

Gtk窗口支持使用开罗的透明度。我试图获得代码here的屏幕截图。但是,它为使用透明度的窗口打印纯黑色。我怎样才能制作一个截图(PNG)的alpha通道也?如何获得Gtk窗口的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"); 
} 
+0

有点难以看到您的屏幕截图,如果生成的图像有alpha或不... – liberforce 2012-03-28 17:02:27

+0

它有黑色的像素,其中的alpha。 – blez 2012-03-28 17:04:07

+0

感谢您分享您的解决方案。我需要一个简单的方法来获得屏幕截图(多显示器)如果你发现这个解决方案做到这一点,我很想知道它吗? – Noitidart 2015-05-08 11:13:23

回答

2

在你的例子中,答案在于gdk_pixbuf_get_from_drawable调用。文档明确地说:

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

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

另一种方法是使用开罗API,这将有GTK 2和GTK 3.工作

+0

请参阅我的编辑。 – blez 2012-03-28 11:01:01

0

...你想如何在

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

的阿尔法通道。如果它有透明度(真实的)然后是rgba。但是,如果窗口管理器不是合成器,而是通过混合图像来模拟此操作,则窗口管理器可能仍然存在问题,将返回黑色(0)而不是颜色/ Alpha值。