Używam Pythona i GTK 3, aby nakładać obrazy na strumieniu wideo GSTREAMER i próbuję użyć widgetu GTK.OVERLAY (), aby to zrobić. Obraz jest plikiem .png z przezroczystym tłem. Jestem w stanie nakładać obraz tylko w porządku, ale kiedy nakładam obraz, ma białe kwadrat jako tło, a nie pokazując wideo pod spodem.

Fragment kodu:

    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)

Pełny kod:

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()

Wynik: Wyjście wyświetlacza

Dzięki!

2
cadend9 2 sierpień 2020, 01:53

1 odpowiedź

Najlepsza odpowiedź

Możesz spróbować ustawić alfa za pomocą To Metoda composite(...):

pixbuf.composite(pixbuf, 0, 0, 240, 240, 0, 0, 1, 1, GdkPixbuf.InterpType.INTERP_NEAREST, 0)
1
jackw11111 2 sierpień 2020, 20:13