2012-03-28 30 views
1

Gtkのウィンドウは、カイロを使用して透過性をサポートしています。コードhereでスクリーンショットを取得しようとしました。しかし、透過性を使用するウィンドウでは純粋な黒が印刷されます。どのようにしてアルファチャンネルをあわせるスクリーンショット(PNG)を作ることができますか?GtkウィンドウのPNG(アルファチャンネル)スクリーンショットを取得するには?

編集:私はalpha 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"); 
} 
+0

結果の画像にアルファが含まれているかどうかを確認することが難しいです。 – liberforce

+0

アルファがある場所に黒いピクセルがあります。 – blez

+0

あなたのソリューションを共有してくれてありがとう。私はあなたがこの解決策を見つけたら私が勝ったスクリーン(マルチモニター)のスクリーンショットを取得する簡単な方法を必要としていますか? – Noitidart

答えて

2

あなたの例では、回答はgdk_pixbuf_get_from_drawableコールにあります。ドキュメントは、明示的に述べている:

指定された宛先PIXBUFのdestがNULLの場合、この関数は、幅と高さの引数で指定された同じ大きさで、8チャンネル当たりのビットおよびアルファなしでRGBのPIXBUFを作成します。この場合、dest_xおよびdest_y引数は0として指定する必要があります。指定された宛先pixbufがNULLでなく、アルファ情報を含む場合、塗りつぶされたピクセルは完全不透明(アルファ= 255)に設定されます。

だから、最初の引数としてalphaチャネルを持つpixbufを渡すだけで十分だと思います。それを行うには

もう一つの方法は、GTK 2とGTKで3

+0

私の編集をご覧ください。 – blez

0

を働くことになる、カイロのAPIを使用することです...それならば、あなたは

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

にアルファシャネルをする方法透明度(本当のもの)があり、次にrgbaです。しかし、まだウィンドウマネージャに問題があるかもしれません。イメージが合成されていないのにイメージをブレンドして模倣し、カラー/アルファ値の代わりに黒(0)を返します。

関連する問題