Estoy usando Python y GTK 3 para superponer imágenes en una transmisión de video GStreamer, y estoy intentando usar el widget Gtk.Overlay () para hacer esto. La imagen es un archivo .png con fondo transparente. Puedo superponer la imagen muy bien, pero cuando superpongo la imagen, tiene un cuadrado blanco como fondo en lugar de mostrar la secuencia de video debajo.

Fragmento de código:

    overlay = Gtk.Overlay()
    # the drawing area holds the Gstreamer video stream
    drawing_area = Gtk.DrawingArea()
    drawing_area.set_double_buffered(True)
    overlay.add(drawing_area)
    # set the drawing area as the base layer of the overlay

    pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename='icon.png', width=240, height=240, preserve_aspect_ratio=True)
    img = Gtk.Image.new_from_pixbuf(pixbuf)
    img.set_halign(Gtk.Align.START)
    img.set_valign(Gtk.Align.END)
    overlay.add_overlay(img)
    # overlay the image on the base layer (the video)

Código completo:

from gi.repository import Gdk, Gst, Gtk, GdkX11, GstVideo, GdkPixbuf
import signal

signal.signal(signal.SIGINT, signal.SIG_DFL)

def window_closed(widget, event, pipeline):
    widget.hide()
    pipeline.set_state(Gst.State.NULL)
    Gtk.main_quit()

if __name__ == "__main__":
    Gdk.init([])
    Gtk.init([])
    Gst.init([])
    pipeline = Gst.Pipeline()
    # configuring the pipeline code here,
    # uses nvarguscamerasrc on the Jetson Nano
    
    # Creating the window
    window = Gtk.Window()
    window.connect("delete-event", window_closed, pipeline)
    window.set_default_size(1920, 1080)
    window.set_title("Application")
    
    overlay = Gtk.Overlay()
    # the drawing area holds the Gstreamer video stream
    drawing_area = Gtk.DrawingArea()
    drawing_area.set_double_buffered(True)
    overlay.add(drawing_area)
    # set the drawing area as the base layer of the overlay

    pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename='icon.png', width=240, height=240, preserve_aspect_ratio=True)
    img = Gtk.Image.new_from_pixbuf(pixbuf)
    img.set_halign(Gtk.Align.START)
    img.set_valign(Gtk.Align.END)
    overlay.add_overlay(img)
    # overlay the image on the base layer (the video)

    window.add(overlay)
    window.show_all()
    window.realize()
    
    xid = drawing_area.get_window().get_xid()
    sink.set_window_handle(xid)
    # set the GStreamer video sink to the drawing area in the window
    
    Gtk.main()

Producción: Mostrar salida

¡Gracias!

2
cadend9 2 ago. 2020 a las 01:53

1 respuesta

La mejor respuesta

Puede intentar configurar el alfa usando this Método composite(...):

pixbuf.composite(pixbuf, 0, 0, 240, 240, 0, 0, 1, 1, GdkPixbuf.InterpType.INTERP_NEAREST, 0)
1
jackw11111 2 ago. 2020 a las 20:13