我正在使用 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(32位)的事实可能是一个问题吗?在这种情况下,我是唯一一个人吗?
我在以下情况下使用的导入:
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
答案 0 :(得分:0)
在进一步搜索失败后,我注意到,与 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 !
我认为我非常接近发现错误,但我无法指出。
它肯定与内存中保存的data
变量有关。