我从gphoto2检索JPEG,从数据创建Gio流,然后从流中创建Pixbuf:
import gphoto2 as gp
from gi.repository import Gio, GdkPixbuf
camera = gp.Camera()
context = gp.Context
camera.init(context)
file = gp.CameraFile()
camera.capture_preview(file, context)
data = memoryview(file.get_data_and_size())
stream = Gio.MemoryInputStream.new_from_data(data)
pixbuf = GtkPixbuf.Pixbuf.new_from_stream(stream)
# display pixbuf in GtkImage
执行此操作的功能使用GLib.idle_add(...)
附加到Gtk空闲事件。它有效,但它泄漏了记忆。该过程的记忆使用不断攀升。它甚至在构造pixbuf的行被注释掉时也会泄漏,但是当构造流的行也被注释掉时,它就会泄漏,所以看起来它本身就是泄漏的流本身。在构建pixbuf之后添加stream.close()
并没有帮助。
在这里发布内存的正确方法是什么?
答案 0 :(得分:2)
我不会称之为答案,如果有人知道这个问题的直接答案,我很乐意将其标记为正确答案,但这是针对同一职位的其他人的解决方法:
import gphoto2 as gp
from gi.repository import Gio, GdkPixbuf
camera = gp.Camera()
context = gp.Context
camera.init(context)
file = gp.CameraFile()
camera.capture_preview(file, context)
data = memoryview(file.get_data_and_size())
loader = GdkPixbuf.PixbufLoader.new()
loader.write(data)
pixbuf = loader.get_pixbuf()
# use the pixbuf
loader.close()
这不再泄漏记忆。