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

Python 从PIL.image获取二进制图像数据?,python,python-imaging-library,Python,Python Imaging Library,我在PIL中打开了一个图像,如下所示: from PIL import Image i = Image.open("image.jpg") 我需要访问此文件的原始内容。我如何才能获得整个图片数据,就好像我会打开(…)。read()?PIL使用一种延迟打开机制,在这种机制中,仅在需要时读取文件内容。 为此,它可能会将文件引用保留在某些内部(私有)属性中 即使这个属性是可访问的,它也肯定不会作为官方PILAPI的一部分公开——而且它肯定不会以这种方式使用 一旦数据被读取,文件内容就会被解码,并作

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

from PIL import Image

i = Image.open("image.jpg")

我需要访问此文件的原始内容。我如何才能获得整个图片数据,就好像我会打开(…)。read()?

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

即使这个属性是可访问的,它也肯定不会作为官方PILAPI的一部分公开——而且它肯定不会以这种方式使用

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


如果您想要原始文件内容,您可能需要使用其他模块处理图像,或者存储图像,或者以与实际图像内容无关的形式对数据进行迭代-您不能只使用常规的“打开”按钮打开文件吗?

如果您想要获取图像的实际字节,请使用。这是有,我不确定它是否在原始的
PIL
模块中,但从文档中应该是这样的。

您可以看到这个答案

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

output = io.BytesIO()
img.save(output, format='JPEG')
然后使用.getvalue()方法获取写入的数据:

在PIL中:

Image.open(path).convert('1')
如中所述


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

既然您接受了“.tobytes”问题,我留下这个评论是为了让未来的读者明白:您实际上想要的是“原始像素数据”,而不是“文件的原始内容”-这就是我解释的获取方法。哦,真的吗?然后我接受你的回答,我想要原始文件。我使用的是Microsoft认知API,它需要一个二进制图像数据。我第一次尝试使用常规的open函数发送数据,也尝试使用base64进行编码/解码,但没有成功。不过,这确实有效,因此如果将来有人使用它,请尝试以这种形式获取数据。这仍然不会提供原始文件的字节,只提供内存中的原始(未压缩)图像字节。如果你有一个小的图像,很容易验证<代码>f=open('pic.jpg')
img=PIL.Image.open(f.tobytes()
f.seek(0)
img==f.read()
的计算结果应为
False
正确答案。在创建时,有一个
Image.fp
属性可用,它指向用于创建
Image
对象的原始文件。只要
图像
对象未读取文件的全部内容,该属性就指向该文件。一旦发生这种情况,
Image.fp
将指向
None
,并且不再保留对原始文件的引用。
Image.open(path).convert('1')