2

我正在开发一个使用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

4

1 回答 1

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内存中保存的变量有关。

于 2013-02-07T16:09:05.440 回答