我在QImage中有一个图像,我希望在显示它之前在PIL中处理它。虽然ImageQT类允许我将PIL图像转换为QImage,但似乎没有任何东西可以从QImage转换为PIL图像。
答案 0 :(得分:12)
我使用以下代码将其从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)
在开始工作之前我尝试了很多组合。
答案 1 :(得分:2)
另一条路线是:
正如Virgil所提到的,数据必须是32位(或4字节)对齐,这意味着你需要记住在步骤3中指定步幅(如代码片段所示)。
答案 2 :(得分:1)
from PyQt4 import QtGui, QtCore
img = QtGui.QImage("greyScaleImage.png")
bytes=img.bits().asstring(img.numBytes())
from PIL import Image
pilimg = Image.frombuffer("L",(img.width(),img.height()),bytes,'raw', "L", 0, 1)
pilimg.show()
感谢Eli Bendersky,您的代码很有用。
答案 3 :(得分:1)
#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()
答案 4 :(得分:0)
您可以将QImage转换为Python字符串:
>>> image = QImage(256, 256, QImage.Format_ARGB32)
>>> bytes = image.bits().asstring(image.numBytes())
>>> len(bytes)
262144
从此转换为PIL应该很容易。
答案 5 :(得分: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)