2012-03-28 12 views
1

Gtk Windows unterstützt Transparenz mit Cairo. Ich habe versucht, einen Screenshot mit dem Code here zu bekommen. Aber es druckt reines Schwarz für Fenster, die Transparenz verwenden. Wie kann ich einen Screenshot (PNG) erstellen, der auch den Alphakanal abbildet?Wie bekomme ich einen PNG (Alpha Kanal) Screenshot von Gtk Fenster?

EDIT: Ich habe versucht mit Alpha Pixbuf, aber die Ausgabe ist immer noch ohne Alpha. Hier ist mein Code (singen Gtk #, aber es ist ziemlich identisch mit 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"); 
} 

Hier ist der Ausgang: enter image description here

EDIT: Ich habe es mit Kairo Oberfläche. Hier ist der Code, den ich verwenden:

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

irgendwie schwer auf Ihrem Screenshot zu sehen, wenn das resultierende Bild alpha oder nicht hat ... – liberforce

+0

Es hat schwarze Pixel, wo die Alpha sind. – blez

+0

Vielen Dank für Ihre Lösung. Ich brauche eine einfache Möglichkeit, Screenshots von Bildschirmen (Multi-Monitore) zu erhalten Ich war begeistert, wenn Sie diese Lösung gefunden haben, um das zu tun? – Noitidart

Antwort

2

In Ihrem Beispiel die Antwort liegt auf den gdk_pixbuf_get_from_drawable Anruf. Die Dokumentation ausdrücklich sagt:

Wenn der angegebene Ziel pixbuf dest NULL ist, dann wird diese Funktion eine RGB pixbuf mit 8 Bit pro Kanal und ohne Alpha, mit der gleichen Größe durch die Breite und Höhe Argumente angegeben erstellen. In diesem Fall müssen die Argumente dest_x und dest_y als 0 angegeben werden. Wenn der angegebene Ziel-Pixbuf nicht NULL ist und Alpha-Informationen enthält, werden die gefüllten Pixel auf volle Deckkraft (Alpha = 255) gesetzt.

Also ich denke, dass die Weitergabe eines Pixbuf mit einem Alpha-Kanal als erstes Argument genug sein sollte.

Ein anderer Weg, es zu tun ist, um die kairo API zu verwenden, die mit GTK 2 und GTK 3.

+0

Bitte sehen Sie meine Bearbeitung. – blez

0

... funktionieren würde und wie wollen Sie einen Alpha-chanel in

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

Wenn es hat Transparenz (echte) dann ist rgba. Aber Sie können immer noch Probleme mit dem Window-Manager haben, wenn er nicht zusammengesetzt ist, sondern dies durch Mischen von Bildern nachahmt, wird Schwarz (0) anstelle von Farbe/Alpha-Wert zurückgegeben.