为`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)。你必须提前知道这个尺寸。
一些示例代码来演示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)
【讨论】:
所以你的意思是,如果你在十六进制编辑器中打开 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:我是不是必须为超类构造函数指定参数。那会是啥论据?
为 SpringBoot 应用程序指定密钥库时 javax.net.ssl.keyStore 和 server.ssl.key-store 属性有啥区别