11

QImage に画像があり、表示する前に PIL で処理したいと考えています。ImageQT クラスを使用すると PIL イメージを QImage に変換できますが、QImage から PIL イメージに変換するものはないようです。

4

6 に答える 6

13

次のコードで QImage から PIL に変換します。

img = QImage("/tmp/example.png")
buffer = QBuffer()
buffer.open(QIODevice.ReadWrite)
img.save(buffer, "PNG")

strio = cStringIO.StringIO()
strio.write(buffer.data())
buffer.close()
strio.seek(0)
pil_im = Image.open(strio)

動作させる前に、多くの組み合わせを試しました。

于 2009-11-18T14:59:01.577 に答える
2
#Code for converting grayscale QImage to PIL image

from PyQt4 import QtGui, QtCore
qimage1 = QtGui.QImage("t1.png")
bytes=qimage1.bits().asstring(qimage1.numBytes())
from PIL import Image
pilimg = Image.frombuffer("L",(qimage1.width(),qimage1.height()),bytes,'raw', "L", 0, 1)
pilimg.show()
于 2010-08-30T23:19:29.723 に答える
2
from PyQt5 import QtGui
from PIL import Image

img = QtGui.QImage(width, height, QImage.Format_RGBA8888)
data = img.constBits().asstring(img.byteCount())
pilimg = Image.frombuffer('RGBA', (img.width(), img.height()), data, 'raw', 'RGBA', 0, 1)
from PyQt4 import QtGui
from PIL import Image

img = QtGui.QImage("greyScaleImage.png")
bytes = img.bits().asstring(img.numBytes())
pilimg = Image.frombuffer('L', (img.width(), img.height()), bytes, 'raw', 'L', 0, 1)
pilimg.show()

Eli Bendersky に感謝します。あなたのコードは役に立ちました。

于 2010-08-27T21:12:46.570 に答える
2

別のルートは次のとおりです。

  1. 画像データを numpy 配列にロードします ( PIL を使用したコード例)
  2. numpy、scipy、または scikits.image を使用して画像を操作します。
  3. データを QImage にロードします (例: scikits.image アーカイブ (1 にリンク) をブラウズし、qt_plugin.py の 45 行目を見てください。申し訳ありませんが、stackoverflow ではまだリンクを投稿できません)。

Virgil が言及しているように、データは 32 ビット (または 4 バイト) でアラインされている必要があります。つまり、ステップ 3 でストライドを指定することを覚えておく必要があります (スニペットに示されているように)。

于 2009-11-19T23:07:44.883 に答える
0

QImage を Python 文字列に変換できます。

>>> image = QImage(256, 256, QImage.Format_ARGB32)
>>> bytes = image.bits().asstring(image.numBytes())
>>> len(bytes)
262144

これを PIL に変換するのは簡単です。

于 2009-11-14T06:32:03.450 に答える
0

PySide2 5.xこれは、 qt の公式の python ラッピングであるを使用している人への回答です。彼らはまたのために働くべきですPyQt 5.x

また、これと組み合わせて使用​​したものに追加しましたQImage。主に、カラー チャネルの変更を追跡する必要がないため、依存関係numpyを使用することを好みます。PIL

from PySide2 import QtCore, QtGui
from PIL import Image
import io


def qimage_to_pimage(qimage: QtGui.QImage) -> Image:
    """
    Convert qimage to PIL.Image

    Code adapted from SO:
    https://stackoverflow.com/a/1756587/7330813
    """
    bio = io.BytesIO()
    bfr = QtCore.QBuffer()
    bfr.open(QtCore.QIODevice.ReadWrite)
    qimage.save(bfr, 'PNG')
    bytearr = bfr.data()
    bio.write(bytearr.data())
    bfr.close()
    bio.seek(0)
    img = Image.open(bio)
    return img

ここに変換するnumpy.ndarrayものがありますQImage

from PIL import Image, ImageQt
import numpy as np

def array_to_qimage(arr: np.ndarray):
    "Convert numpy array to QImage"
    img = Image.fromarray(arr)
    return ImageQt.ImageQt(img)

于 2019-04-30T01:38:52.620 に答える