Как получить скриншот PNG (альфа-канала) окна Gtk? - PullRequest
1 голос
/ 28 марта 2012

GTC окна поддерживают прозрачность с помощью Cairo. Я попытался получить скриншот с кодом здесь . Но он печатает чисто черный для окон, которые используют прозрачность. Как сделать снимок экрана (PNG), который также захватывает альфа-канал?

РЕДАКТИРОВАТЬ: я пытался с альфа pixbuf, но на выходе все еще без альфа. Вот мой код (спой 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 ]

2 голосов
/ 28 марта 2012

В вашем примере ответ лежит на вызове gdk_pixbuf_get_from_drawable .В документации явно сказано:

Если заданный целевой буфер изображения является NULL, то эта функция создаст пиксельный буфер RGB с 8 битами на канал и без альфа-канала, с тем же размером, заданным шириной и высотойаргументы.В этом случае аргументы dest_x и dest_y должны быть указаны как 0. Если указанный целевой буфер изображения не равен NULL и содержит альфа-информацию, то для заполненных пикселей будет установлена ​​полная непрозрачность (альфа = 255) ,

Так что я думаю, что передачи pixbuf с альфа-каналом в качестве первого аргумента должно быть достаточно.

Другой способ сделать это - использовать API cairo, который будет работать с GTK 2 и GTK 3.

0 голосов
/ 08 июня 2012

... и как вы хотите альфа-канал в

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

Если у него есть прозрачность (реальная), то это rgba.Но у вас все еще могут быть проблемы с оконным менеджером, если он не является композитным, а имитирует это путем смешивания изображений, он вернет черный (0) вместо значения цвета / альфа.

...