将PyQt转换为PIL图像
我有一张图片,存储在QImage格式中,我想在显示之前用PIL来处理一下这张图片。虽然ImageQT这个类可以让我把PIL格式的图片转换成QImage格式,但似乎没有办法把QImage格式的图片转换成PIL格式。
6 个回答
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,你的代码很有帮助。
2
另一种方法是:
- 把图片数据加载到一个numpy数组里(可以参考这个示例代码,它使用了PIL库)
- 用numpy、scipy或者scikits.image来处理这个图片
- 把数据加载到QImage中(例如:可以查看scikits.image的档案,链接在第一步中,看看qt_plugin.py的第45行——抱歉,stackoverflow不让我发更多链接)
正如Virgil提到的,数据必须是32位(或者4字节)对齐的,这意味着在第三步时你需要记得指定步幅(就像代码片段中显示的那样)。
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)
在成功之前,我尝试了很多不同的组合。