Python 从字节文件打开PIL映像

Python 从字节文件打开PIL映像,python,pillow,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() 抛出异常 ValueError:图像数据不足 为什么??我做错了什么?表示它可以接受类似文件的对象,因此您应该能够传入一个io.BytesIO对象,该对象由包

我的内存中存储了大小为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:图像数据不足

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

表示它可以接受类似文件的对象,因此您应该能够传入一个
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 = 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.

.png
文件中的原始数据有标题、压缩和其他内容,因此我认为您无法将其从字节中输入
并获得一致的结果。如何消除这种情况?我想您可以使用
image.open(“homer.jpg”)
打开图像,然后在其上调用
tobytes
,以获取适合传递给
frombytes
的缓冲区。。。但是,当您只需执行
image=image.open(“homer.jpg”)
时,执行
image=image.frombytes(image.open(“homer.jpg”).tobytes())并没有多大意义。我假设您的实际用例更复杂,并且由于某种原因您不能执行后者。所以您的实际问题是“如何从套接字读取数据?”?不,这已经起作用了。但不是套接字->将图像存储到文件->从此文件加载->完成,我希望套接字->完成。我试着把问题弄清楚一点!没有
Image.open
io.BytesIO
需要知道以某种方式给出的图像格式是什么?@JeromeJ大多数图像格式都有一个标头,用于标识正在使用的格式。枕头用它来识别图像。有关示例,请参见。@BluePython
fromBytes
用于像素的原始数组,例如
width*height
RGBA
值的长数组
open
用于以特定格式编码的图像,如PNG或JPEG,通常压缩像素数据,并且可能有其他需要处理的数据,如标题或EXIF信息。我喜欢这个答案比公认的答案有10倍以上的投票。我也从我这里得到了一个,因为它好多了。@user136036我不会说它更好,因为它使用了一个不同的函数,在一个OP询问的不同情况下使用。OP询问有关打开原始图像数据的问题,此答案显示如何打开常规图像文件。但对于某些人(包括我)来说,这仍然是一个有用的答案。该函数也很有用,因为它不创建新的缓冲区,而是使用(如果可能的话)原始缓冲区。由于Image.frombytes缺乏良好的描述,此答案不可用。我只想通过curl传递jpg图像,并得到由于frombytes导致的问题,完全不知道如何处理压缩图像>请注意,此函数仅解码像素数据,而不是整个图像。如果在字符串中包含整个图像,请将其包装在BytesIO对象中,然后使用open()加载它。