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