【问题标题】:How to get a PNG (alpha channel) screenshot of Gtk window?如何获得 Gtk 窗口的 PNG(alpha 通道)屏幕截图?
【发布时间】:2012-03-28 00:53:03
【问题描述】:

Gtk 窗口支持使用 Cairo 的透明度。我试图用代码here 截屏。但是对于使用透明度的窗口,它会打印纯黑色。如何制作同时捕获 Alpha 通道的屏幕截图 (PNG)?

编辑:我尝试使用 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");   
}

【问题讨论】:

  • 如果生成的图像有 alpha 或没有 alpha,在您的屏幕截图中很难看到...
  • 它在 alpha 所在的位置有黑色像素。
  • 感谢分享您的解决方案。我需要一种简单的方法来获取屏幕截图(多显示器)我很想知道你是否找到了这个解决方案来做到这一点?

标签: mono gtk pygtk cairo pycairo


【解决方案1】:

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

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

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

另一种方法是使用 cairo API,它适用于 GTK 2 和 GTK 3。

【讨论】:

    【解决方案2】:

    ...以及您想要一个 alpha chanel 的方式

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多