将JPEG字符串转换为PIL图像对象

16

我从应用程序后端收到了一个文件列表,它们应该是jpeg文件。但是我怎么也无法将它们转换为PIL图像对象。当我调用:

str(curimg)

我得到了回复:

<type 'str'>

我已经尝试使用open()、.read、io.BytesIO(img.read())以及什么也不做,但它仍然将其视为字符串。当我打印该字符串时,我得到了无法识别的字符。有人知道如何告诉Python将此字符串解释为JPEG并将其转换为PIL图像,以便我可以调用.size和np.array吗?


1
这个问题的答案是否符合您的需求?链接 - Octopus
你尝试过 Image.fromstring() 吗? - Anand S Kumar
唯一的问题是我不知道如何获取 fromstring() 需要的大小? 我只有一个字符串。 - mt88
4个回答

26
from PIL import Image
import io
Image.open(io.BytesIO(image))

注意:

如果图片在网络上,您需要先下载它。

import requests
image = requests.get(image_url).content  #download image from web

然后将其传递给io模块。

io.BytesIO(image)
如果图像已经在您的硬盘上,您可以直接使用PIL打开。
Image.open('image_file.jpg')  #image in your HD

13
你应该能够将一个StringIO对象传递给PIL并以这种方式打开它。
即:

ie:

from PIL import Image
import StringIO
tempBuff = StringIO.StringIO()
tempBuff.write(curimg)
tempBuff.seek(0) #need to jump back to the beginning before handing it off to PIL
Image.open(tempBuff)

4
我正在使用Python 3.6,当我使用这种方法时出现错误:"StringIO不能用于打开图像。" 值错误:StringIO不能用于打开图像。必须使用二进制数据。 - Suraj S Jain

2

对我来说,以上解决方案都没有起作用。

我最终通过以下方法成功地正确读取了字符串:

from PIL import Image
img = Image.frombytes('RGB', (640, 480), img_str, 'raw')

为了测试它,您可以执行类似以下的操作:
image = Image.open("some.png")
print(image.mode, image.size) # OUT: 'RGB' (640, 480)
image = Image.frombytes('RGB', (640, 480), image.tobytes(), 'raw')
image.show()

我刚看到这个。我遇到了类似的问题。如果你还对此有新鲜的了解,能否请你向我解释一些事情? - CCCC
我不再使用PIL了,但我可以尝试帮忙。 - VanDavv
你好@Vandavv,感谢你的愿意帮助。我已经解决了问题。现在图片可以显示了。但是我还有另一个问题。我想要更新以jpg格式显示的检索到的图像。请问我该如何操作?图像标签(即qpixmap标签)是self.passlb。所以在我的SQL更新语句中,我尝试过: values(self.fullname.text(), self.passlb.pixmap() ...)``` 但它没有起作用。你知道我应该使用什么方法来更新qpixmap标签吗? - CCCC
1
@VanDavv,非常感谢!我有一个PpmImageFile对象,但是无法弄清如何转换它。在这里得到了一些线索(https://stackoverflow.com/questions/65597315/how-to-return-a-list-of-pil-image-files-from-fastapi-response),但是还没有完全弄清楚。 - CaTx

0

@CEO(根据this的评论)我不知道SQL在这里扮演什么角色,也不确定你想要实现什么,但我记得我曾经遇到过一些问题,以下是解决方法,希望能对你有所帮助

    frame = self._rawNode.display_frame.copy()
    width = int(self.customLayout.geometry().width())
    height = int(frame.shape[0] * (width / frame.shape[1]))
    display_frame = cv2.cvtColor(cv2.resize(frame, (width, height)), cv2.COLOR_BGR2RGB)
    qImg = QtGui.QImage(display_frame.data, width, height, 3 * width, QtGui.QImage.Format_RGB888)
    self.pixmap = QtGui.QPixmap(qImg)
    self.Imagelabel.setPixmap(self.pixmap)

你好 @vanDavv,我已经解决了。现在没问题了。我目前有一个不同的问题需要解决,但很不幸我被拒绝在这里提问。 - CCCC
没问题,我随时乐意提供帮助。 - VanDavv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接