我正在开发一个使用PIL加载图片的 Qt 应用程序,修改颜色和 alpha 通道,然后将它们转换为 QImage。
这是有问题的一段代码:ImageQt函数的正常重复使用:
# memory is filled around 7 mB/s
if name == 'main':
while True:
im = Image.open('einstein.png') #small picture
imQt = QtGui.QImage(ImageQt.ImageQt(im)) # convert to PySide.QtGui.QImage
imQt.save('outtest.png')# -> rendered picture is correct
#del(imQt) and del(im) does not change anything
time.sleep(0.02)
这里的问题是疯狂的内存填充,当图片应该被垃圾收集器擦除时。我检查了 gc.collect(),但它没有改变任何东西。
这个例子展示了imageQt函数发生了什么,但实际上,我注意到这是QImage引起的一个问题:如果你反复使用QImage构造函数处理数据,python进程使用的内存会增加:
im= Image.load('mypic.png').convert('RGBA')
data = im.toString('raw','RGBA')
qIm = QtGui.QImage(data,im.size[0],im.size[1],QtGui.QImage.Format_ARGB32)
qIm.save('myConvertedPic.png')# -> picture is perfect
如果你把这段代码放在一个循环中,内存会增加,如第一个例子。从那里我有点迷路,因为这是一个 PySide 问题......
我尝试使用一种解决方法,但它也不起作用:
#Workaround, but not working ....
if name == 'main':
while True:
im = Image.open('einstein.png') #small picture
imRGBA = im.convert('RGBA') # convert to RGBA
imRGBA.save('convtest.png') # ->picture is looks perfect
imBytes = imRGBA.tostring('raw','RGBA')
#print("size %d %d" % (imRGBA.size[0],imRGBA.size[1]))
qImage = QtGui.QImage(imRGBA.size[0],imRGBA.size[1],QtGui.QImage.Format_ARGB32) # create new empty picture
qImage.fill(QtCore.Qt.blue) # fill with blue, otherwise it catches pieces of the picture still in memory
loaded = qImage.loadFromData(imBytes,'RGBA') # load from raw data
print("success %d" % loaded)# -> returns 0
qImage.save('outtest.png')# -> rendered picture is blue
time.sleep(0.02)
我真的被困在这里,如果你能帮助找到这个解决方法的解决方案?因为我真的被困在这里了!我还想讨论 QImage 问题。有没有可靠的方法来释放这个内存?在这种情况下,我使用 python3.2(32bits) 会成为问题吗?在这种情况下,我是唯一的一个吗?
我在以下情况下使用的进口商品:
import time
import sys
import PySide
sys.modules['PyQt4'] = PySide # this little hack allows to solve naming problem when using PIL with Pyside (instead of PyQt4)
from PIL import Image, ImageQt
from PySide import QtCore,QtGui