从PIL.Image获取二进制图像数据?

Naf*_*Kay 9 python python-imaging-library

我在PIL中打开了一个图像,如下所示:

from PIL import Image

i = Image.open("image.jpg")
Run Code Online (Sandbox Code Playgroud)

我需要访问此文件的原始内容.如何获得整个图片数据,就好像我会做的那样open(...).read()

小智 18

你可以看到这个答案python Image PIL为二进制Hex

需要再次保存img对象; 将它写入另一个BytesIO对象:

output = io.BytesIO()
img.save(output, format='JPEG')
Run Code Online (Sandbox Code Playgroud)

然后使用.getvalue()方法获取写入的数据:

hex_data = output.getvalue()
Run Code Online (Sandbox Code Playgroud)


Mat*_*DMo 6

如果你想获得图像的实际字节,只需使用i.tobytes().这是Pillow,我不确定它是否在原始PIL模块中,而是来自应该是的文档.

  • 这仍然没有给你原始文件的字节,只有内存中的原始(未压缩)图像字节。很容易验证您是否有小图像。`f = open('pic.jpg');` `img = PIL.Image.open(f).tobytes();` `f.seek(0);` `img==f.read();`应该评估为`False` (6认同)

Mai*_*sad 6

在 PIL 中:

Image.open(path).convert('1')
Run Code Online (Sandbox Code Playgroud)

正如文档中提到的

1模式用于(1位像素,黑白,每个字节存储一个像素)


jsb*_*eno 0

PIL 使用惰性打开机制,仅在需要时才读取文件内容。为此,它可能将文件引用保留在某些内部(私有)属性中。

即使这个属性是可访问的,它肯定不会作为官方 PIL API 的一部分公开 - 并且它肯定不应该以这种方式使用。

读取数据后,文件内容将被解码,并作为像素值保存在内存中(这通常是处理图像时所需的)。该库当然不会将未解码的文件数据保留在内存中的数据结构中,因为它毫无意义。

如果您想要原始文件内容,您可能会使用其他模块处理图像,或存储图像,或以与实际图像内容无关的形式迭代数据 - 难道您不能直接使用以下命令打开文件吗定期“开放”?