1

Gtk ウィンドウは Cairo を使用した透過性をサポートします。コードhereのスクリーンショットを取得しようとしました。ただし、透明度を使用するウィンドウでは純粋な黒が印刷されます。アルファチャンネルもキャプチャするスクリーンショット (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");
} 

出力は次のとおりです。 ここに画像の説明を入力

編集: カイロ サーフェスで行いました。使用したコードは次のとおりです。

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");   
}
4

2 に答える 2

2

あなたの例では、答えはgdk_pixbuf_get_from_drawable呼び出しにあります。ドキュメントには明示的に次のように書かれています。

指定された宛先pixbufdestがNULLの場合、この関数は、幅と高さの引数で指定された同じサイズで、チャネルあたり8ビットでアルファなしのRGBpixbufを作成します。この場合、dest_x引数とdest_y引数は0として指定する必要があります。指定した宛先pixbufがNULLでなく、アルファ情報が含まれている場合、塗りつぶされたピクセルは完全な不透明度(alpha = 255)に設定されます。

したがって、最初の引数としてアルファチャネルを使用してpixbufを渡すだけで十分だと思います。

これを行う別の方法は、GTK2およびGTK3で動作するcairoAPIを使用することです。

于 2012-03-28T08:01:25.490 に答える
0

...そして、どのようにアルファ シャネルを求めるか

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

透明度 (本物) がある場合は、rgba です。ただし、ウィンドウ マネージャーにまだ問題がある可能性があります。合成ではなく、画像をブレンドしてこれを模倣すると、色/アルファ値の代わりに黒 ( 0 ) が返されます。

于 2012-06-07T23:39:44.167 に答える