【问题标题】:Converting jpeg string to PIL image object将 jpeg 字符串转换为 PIL 图像对象
【发布时间】:2015-08-07 17:25:50
【问题描述】:

我收到了一份来自应用程序后端的文件列表,这些文件应该是 jpeg 文件。然而,在我的一生中,我无法将它们转换为 PIL 图像对象。当我打电话时

str(curimg)

我回来了:

<type 'str'>

。我试过使用 open()、.read、io.BytesIO(img.read() 并且什么也没做,但它一直把它看作一个字符串。当我打印字符串时,我得到无法识别的字符。有谁知道如何告诉 python 如何将此字符串解释为 jpeg 并将其转换为可以调用 .size 和 np.array 的药丸图像?

【问题讨论】:

  • this question 有你想要的答案吗?
  • 你试过Image.fromstring() 吗?
  • ^^ 唯一的问题是我不知道如何获得 fromstring() 需要的大小?我得到的只是一个字符串。

标签: python jpeg python-imaging-library


【解决方案1】:

同样的东西,但更简单一些

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

【讨论】:

    【解决方案2】:

    您应该能够将 StringIO 对象传递给 PIL 并以这种方式打开它。

    即:

    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)
    

    【讨论】:

    • 我正在使用 python 3.6,如果我使用此方法,我会收到此错误 "StringIO cannot be used to open an image. " ValueError: StringIO cannot be used to open an image. Binary data must be used instead.
    【解决方案3】:

    对我来说,上述解决方案均无效。

    我终于设法像这样正确读取字符串:

    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()
    

    【讨论】:

    • 我刚遇到这个。我有一个类似的问题。如果您对此仍有新的认识,请您给我解释一下吗?
    • 我不再使用 PIL,但我可以尝试提供帮助
    • 您好@Vandavv,感谢您愿意提供帮助。我已经能够解决它。图片现在显示。但我有另一个问题。我想更新以 jpg 格式显示的检索到的图像。我该怎么做?图像标签(即 qpixmap 标签)是 self.passlb 所以在我的 sql 更新语句中,我尝试了:sql = (my update statement here) values(self.fullname.text(), self.passlb.pixmap() ...) 它不起作用。关于我在更新 qpixmap 标签时应该使用的方法有什么线索吗?
    【解决方案4】:

    @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,我已经解决了。现在好了。我目前正在尝试解决一个不同的问题,但很不幸,我被拒绝在这里提问。
    • 别担心,我很乐意提供帮助
    猜你喜欢
    • 1970-01-01
    • 2018-12-30
    • 2022-06-16
    • 2017-12-20
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    相关资源
    最近更新 更多