在`PIL.Image.frombytes`中指定什么尺寸
我想用原始数据创建一个PIL图像。我觉得我应该使用 PIL.Image.frombytes
这个方法。但是它需要一个 size
参数。我不知道图像的大小,这个大小不是应该是图像的一部分吗?我事先不知道图像的大小。我该怎么在不知道大小的情况下调用这个函数呢?
3 个回答
8
这里的 size
参数必须和图片的尺寸一致,但在一个原始的像素缓冲区中并没有记录这些尺寸信息。举个例子,一个长度为 n 的缓冲区可以表示任何 k×m 像素的网格,只要 k 和 m 都大于0,并且 k×m 等于 n。所以你需要提前知道这个尺寸。
下面是一些示例代码,展示了 tobytes
和 frombytes
的用法:
>>> img = PIL.Image.open("some_image.png")
>>> img.size
(482, 295)
>>> raw = img.tobytes()
>>> img2 = PIL.Image.frombytes(img.mode, img.size, raw)
9
感谢@jan-spurny提供的线索。对于其他需要从字节打开图像的人来说,
from PIL import Image
import io
image_bytes = ...
im = Image.open(io.BytesIO(image_bytes))
20
既然你已经说明了,你不想读取原始的像素数据,而是想要处理内存中的图像文件,那么解决办法就很简单了:不要使用 frombytes
,因为它是用来处理原始像素数据的。你只需要用 StringIO
来打开文件就可以了:
image = Image.open(StringIO.StringIO(image_data))