从字节文件打开 PIL 图像

Posted

技术标签:

【中文标题】从字节文件打开 PIL 图像【英文标题】:Open PIL image from byte file 【发布时间】:2015-12-30 18:01:07 【问题描述】:

我有this image,大小为 128 x 128 像素,RGBA 作为字节值存储在我的内存中。但是

from PIL import Image

image_data = ... # byte values of the image
image = Image.frombytes('RGBA', (128,128), image_data)
image.show()

抛出异常

ValueError: 图像数据不足

为什么?我做错了什么?

【问题讨论】:

.png 文件中的原始数据具有标题和压缩等内容,因此我认为您无法将其输入frombytes 并获得一致的结果。 我该如何摆脱这个? 我猜你可以用Image.open("homer.jpg")打开图片,然后在上面调用tobytes来得到一个适合传递给frombytes的缓冲区...但是这样做@没什么意义987654328@ 当你可以做image = Image.open("homer.jpg")。我假设您的实际用例更复杂,并且由于某种原因您不能执行后者。 所以您的实际问题是“如何从套接字读取数据?”? 不,这已经可以了。但是我想要 socket -> done 而不是 socket -> store image to file -> load from this file -> done 。我试图让问题更清楚一点! 【参考方案1】:

The documentation for Image.open 表示它可以接受类似文件的对象,因此您应该能够传入由包含编码图像的bytes 对象创建的io.BytesIO 对象:

from PIL import Image
import io

image_data = ... # byte values of the image
image = Image.open(io.BytesIO(image_data))
image.show()

【讨论】:

Image.openio.BytesIO 不需要知道它以某种方式给出的图像格式吗? @JeromeJ 大多数图像格式都有一个标头,用于标识正在使用的格式。 Pillow 使用它来识别图像。有关示例,请参见 the PNG header。 @BluePython fromBytes 用于像素的原始数组,例如 width*height 长数组 RGBA 值。 open 用于以特定格式编码的图像,例如 PNG 或 JPEG,通常会压缩像素数据,可能还有其他需要处理的数据,例如标题或 EXIF 信息。 我喜欢这个答案比接受的答案多 10 倍的赞成票。我也买了一个,因为它好多了。 @user136036 我不会说它更好,因为它使用了一种不同的功能,该功能用于 OP 询问的不同情况。 OP询问打开原始图像数据,这个答案显示了如何打开一般图像文件。但这对某些人(包括我)来说仍然是一个有用的答案。【参考方案2】:

你可以试试这个:

image = Image.frombytes('RGBA', (128,128), image_data, 'raw')
源代码:
def frombytes(mode, size, data, decoder_name="raw", *args):
    param mode: The image mode.
    param size: The image size.
    param data: A byte buffer containing raw data for the given mode.
    param decoder_name: What decoder to use.

【讨论】:

Image.frombuffer() 函数也很有用,因为它不会创建新缓冲区,而是使用(如果可能的话)原始缓冲区。 这个答案是不可用的,因为 Image.frombytes 缺乏很好的描述。我只是想通过 curl 传递 jpg 图像并遇到问题,因为 frombytes 完全没有说明如何处理压缩图像 > 请注意,此函数仅解码像素数据,而不是整个图像。如果你有一个字符串中的整个图像,将它包装在一个 BytesIO 对象中,然后使用 open() 来加载它。

以上是关于从字节文件打开 PIL 图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 PIL 从图像中获取像素

PIL:将字节数组转换为图像

PIL 可以使用 pyqt4 资源文件打开图像吗?

PIL 图像以错误的顺序保存(for 循环,枚举索引)

Python:如何从内存中的 zip 文件中读取图像?

导入错误:需要 Python 图像库 (PIL) 才能从 jpeg 文件加载数据