Python imaging library PIL到Qimage转换:Qimage构造函数不释放内存

Python imaging library PIL到Qimage转换:Qimage构造函数不释放内存,python-imaging-library,qimage,Python Imaging Library,Qimage,我正在开发一个Qt应用程序,用PIL加载图片,修改颜色和alpha通道,然后将它们转换为QImage 下面是一段有问题的代码:ImageQt函数的正常重复使用:#内存大约是7 mB/s 如果name='main': 尽管如此: im=Image.open('einstein.png')#小图片 imQt=QtGui.QImage(ImageQt.ImageQt(im))#转换为PySide.QtGui.QImage imQt.save('outtest.png')#->渲染的图片是正确的 #de

我正在开发一个Qt应用程序,用PIL加载图片,修改颜色和alpha通道,然后将它们转换为QImage

下面是一段有问题的代码:ImageQt函数的正常重复使用:
#内存大约是7 mB/s
如果name='main':
尽管如此:
im=Image.open('einstein.png')#小图片
imQt=QtGui.QImage(ImageQt.ImageQt(im))#转换为PySide.QtGui.QImage
imQt.save('outtest.png')#->渲染的图片是正确的
#del(imQt)和del(im)不会改变任何东西
睡眠时间(0.02)
这里的问题是疯狂的内存填充,当图片应该被垃圾收集器擦除时。我使用gc.collect()进行了检查,但它没有改变任何内容

本例显示了imageQt函数的结果,但事实上,我注意到这是由QImage引起的问题:如果对数据重复使用QImage构造函数,python进程使用的内存会增加:
im=Image.load('mypic.png').convert('RGBA'))
data=im.toString('raw','RGBA'))
qIm=QtGui.QImage(数据,im.size[0],im.size[1],QtGui.QImage.Format_ARGB32)
qIm.save('myConvertedPic.png')#->图片非常完美
如果将此代码放入循环中,内存将增加,如第一个示例所示。从那里我有点迷路,因为这是一个PySide问题

我尝试使用变通方法,但也不起作用:
#解决方法,但不起作用……
如果name='main': 尽管如此: im=Image.open('einstein.png')#小图片 imRGBA=im.convert('RGBA')#convert to RGBA imRGBA.save('convtest.png')#->图片看起来很完美 imBytes=imRGBA.tostring('raw','RGBA')) #打印(“大小%d%d”%(imRGBA.size[0],imRGBA.size[1])) qImage=QtGui.qImage(imRGBA.size[0],imRGBA.size[1],QtGui.qImage.Format_ARGB32)#创建新的空图片 qImage.fill(QtCore.Qt.blue)#用蓝色填充,否则它会捕获仍在内存中的图片片段 loaded=qImage.loadFromData(imBytes,'RGBA')#从原始数据加载 打印(“成功%d”%loaded)#->返回0 qImage.save('outtest.png')#->渲染图片为蓝色 睡眠时间(0.02)
我真的被困在这里了,你能帮我找到解决办法吗?因为我真的被困在这里了! 我还想讨论QImage问题。有没有可靠的方法来释放这个内存?在这种情况下,我使用python3.2(32位)会是一个问题吗?我是唯一一个这样的人吗

我在以下情况下使用的导入:

导入时间
导入系统
导入PySide
sys.modules['PyQt4']=PySide#这个小技巧允许在PySide中使用PIL(而不是PyQt4)时解决命名问题
从PIL导入图像,ImageQt
从PySide导入QtCore、QtGui

在进一步搜索失败后,我注意到与QImage构造函数关联的PIL函数image.tostring()导致了这个问题
    im = Image.open('einstein.png').convert('RGBA')
    data = im.tostring('raw','RGBA') # the tostring() function is out of the loop
    while True:
        imQt = QtGui.QImage(data,im.size[0],im.size[1],QtGui.QImage.Format_ARGB32)
        #imQt.save("testpic.png") #image is valid
        time.sleep(0.01)
        #no memory problem !
我想我真的很快就能找到问题所在,但我无法指出。
它肯定与存储在内存中的
数据
变量有关。

我遇到了一个相关的问题。我相信PIL并没有正确地解释图像中的“数据”指针。在我的例子中,我遇到了一个问题,关联的内存被多次“空闲”调用,崩溃/堆栈转储与此相关。
img.tostring(“raw”,“RGBA”,0,-1))
是daeview表单pycollada如何做到这一点的