在`PIL.Image.frombytes`中指定什么尺寸

18 投票
3 回答
22217 浏览
提问于 2025-04-18 15:02

我想用原始数据创建一个PIL图像。我觉得我应该使用 PIL.Image.frombytes 这个方法。但是它需要一个 size 参数。我不知道图像的大小,这个大小不是应该是图像的一部分吗?我事先不知道图像的大小。我该怎么在不知道大小的情况下调用这个函数呢?

3 个回答

8

这里的 size 参数必须和图片的尺寸一致,但在一个原始的像素缓冲区中并没有记录这些尺寸信息。举个例子,一个长度为 n 的缓冲区可以表示任何 k×m 像素的网格,只要 km 都大于0,并且 k×m 等于 n。所以你需要提前知道这个尺寸。

下面是一些示例代码,展示了 tobytesfrombytes 的用法:

>>> 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))

撰写回答