为`PIL.Image.frombytes`指定啥大小

Posted

技术标签:

【中文标题】为`PIL.Image.frombytes`指定啥大小【英文标题】:What size to specify to `PIL.Image.frombytes`为`PIL.Image.frombytes`指定什么大小 【发布时间】:2014-09-19 17:10:50 【问题描述】:

我想从原始数据创建一个 PIL 图像。我相信我应该使用PIL.Image.frombytes。但它有一个size 参数。我不知道图像的大小,那不应该作为图像的一部分吗?我事先不知道图像的大小。我应该如何调用没有大小的函数?

【问题讨论】:

如果你有原始图像数据,那么你必须有一些关于图像尺寸、像素格式、位深度等的信息。否则就无法“猜测”它们的值。跨度> 你能添加一些最小的示例代码来展示你的问题吗? 也许你误解了我的意思。我有一个 bytes 对象,其中包含图像文件(png、jpg 或 gif)的内容。其中不包含大小吗?我应该使用frombytes 以外的东西来加载它吗?如果这是唯一的方法,我可以创建一个BytesIO 并使用Image.open,但我认为必须为一个简单的操作创建辅助对象是愚蠢的,我希望还有另一种方法。有吗? 是的,我误解了你。因为你的问题很有误导性。你说需要Image.frombytes 功能的帮助来阅读raw data。但raw data 通常表示raw pixel data。几乎没有人可以猜到您实际上只想从内存中打开图像文件。 【参考方案1】:

size 参数必须与未编码在原始像素缓冲区中的图像尺寸匹配(例如,长度为 n 的缓冲区可以表示 k 的任何网格×m 个像素为 k, m > 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)

【讨论】:

所以你的意思是,如果你在十六进制编辑器中打开 png 图像,然后将文件的十六进制发送给我,我将无法知道图像的大小? @RamRachum 你问错了问题(我建议编辑),看起来你实际上有 pixel data 你想阅读 - 因为那是 @987654325 @ 做。所以 larsmans(我也在评论提问中)回答了这个问题,而不是你真正需要的。【参考方案2】:

既然您澄清了,您不想读取原始像素数据,而是读取内存中的图像文件,解决方案很明确:不要使用frombytes - 它适用于原始像素数据。使用刚刚从StringIO打开:

image = Image.open(StringIO.StringIO(image_data))

【讨论】:

ModuleNotFoundError: 没有名为“StringIO”的模块 @AlexR 请试试这个***.com/questions/11914472/stringio-in-python3【参考方案3】:

感谢@jan-spurny 提供线索。对于需要从字节打开图像的其他人

from PIL import Image
import io


image_bytes = ...

im = Image.open(io.BytesIO(image_bytes))

【讨论】:

以上是关于为`PIL.Image.frombytes`指定啥大小的主要内容,如果未能解决你的问题,请参考以下文章

Typescript React:我是不是必须为超类构造函数指定参数。那会是啥论据?

Java有啥方法可以将string转换为指定类型的方法不

如果同时指定 EHsc 和 EHa 会发生啥

为 SpringBoot 应用程序指定密钥库时 javax.net.ssl.keyStore 和 server.ssl.key-store 属性有啥区别

html中的hr啥意思?

char是啥类型