从字节文件打开 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.open
或 io.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 图像的主要内容,如果未能解决你的问题,请参考以下文章