2

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

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 に答える