Я использую Python и GTK 3 для наложения изображений на видеопоток GStreamer, и я пытаюсь использовать для этого виджет Gtk.Overlay (). Изображение представляет собой файл .png с прозрачным фоном. Я могу нормально наложить изображение, но когда я накладываю изображение, оно имеет белый квадрат в качестве фона, а не показывает видеопоток внизу.
Фрагмент кода:
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)
Полный Код:
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()
Вывод: Вывод на дисплей
Спасибо!