PILで画像をロードし、色とアルファチャンネルを変更してから QImage として変換するQt アプリケーションを開発しています。
問題のあるコードは次のとおりです: 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