2012-03-28 50 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值。