从字节文件打开PIL图像

Mic*_*ner 37 python pillow

我有这个大小为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()
Run Code Online (Sandbox Code Playgroud)

抛出异常

ValueError:没有足够的图像数据

为什么?我究竟做错了什么?

Col*_*Two 121

该文档Image.open说它可以接受类文件对象,因此您应该能够传入io.BytesIObytes包含编码图像的对象创建的对象:

from PIL import Image
import io

image_data = ... # byte values of the image
image = Image.open(io.BytesIO(image_data))
image.show()
Run Code Online (Sandbox Code Playgroud)

  • @JeromeJ大多数图像格式都有一个标题,用于标识正在使用的格式.枕头使用它来识别图像.有关示例,请参阅[PNG标题](https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header). (6认同)
  • `Image.open` 或 `io.BytesIO` 不需要知道它以某种方式给出的图像格式吗? (4认同)
  • @BluePython `fromBytes` 用于原始像素数组,例如 `RGBA` 值的 `width*height` 长数组。“open”适用于以特定格式编码的图像,例如 PNG 或 JPEG,通常会压缩像素数据,并且可能还有其他需要处理的数据,例如标头或 EXIF 信息。 (4认同)
  • 我喜欢这个答案的支持率比已接受的答案多 10 倍。还从我这里得到了一份,因为它好多了。 (4认同)

小智 12

你可以试试这个:

image = Image.frombytes('RGBA', (128,128), image_data, 'raw')
Run Code Online (Sandbox Code Playgroud)
源代码:
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.
Run Code Online (Sandbox Code Playgroud)

  • > 请注意,此函数仅解码像素数据,而不是整个图像。如果字符串中有整个图像,请将其包装在 BytesIO 对象中,然后使用 open() 加载它。 (4认同)
  • [Image.frombuffer()](https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.frombuffer) 函数也很有用,因为它不会创建新的缓冲区,而是使用(如果可能的话)原始缓冲区。 (2认同)