解释图像的字节数组

Posted

技术标签:

【中文标题】解释图像的字节数组【英文标题】:Interpret byte array of an image 【发布时间】:2014-11-18 21:05:14 【问题描述】:

图像的字节数组中存储了什么? 我正在做一个项目,其中需要解释存储在图像字节数组中的内容。 我们如何解释字节数组的元素?

注意: 以下是python中生成字节数组的代码

from array import array
f = open("temp.jpg", "rb")
bytes = bytearray(f.read())

【问题讨论】:

你的程序是如何构造字节数组的?你是从光盘文件中读取的吗?您是否使用库来创建它?是外部代理传给你的吗? @Robᵩ 我已对问题进行了编辑 解释 JPEG 文件的字节不是一个简单的问题,参见例如en.wikipedia.org/wiki/JPEG_File_Interchange_Format 和 en.wikipedia.org/wiki/JPEG#Syntax_and_structure。你能更具体地说明你想要做什么吗? JPEG 不是字节数组。即使你有一个字节数组,你也需要找到它所在格式的定义,看看应该如何解释它。 (除了电影和电视节目,没有通用的图像表示。) 我猜您实际上想要的是某种像素值数组,而不仅仅是构成 JFIF 标头和压缩图像的字节数组。如果你想这样做,你需要通过使用像 PIL/Pillow 这样的第三方库来明确要求它。 【参考方案1】:

你已经用 python-imaging-library 标记了它,但你没有在问题的任何地方提到它,你也没有使用它。

我强烈怀疑您实际上想要使用它。您对构成 JFIF 标头、压缩图像数据、EXIF 段等的字节数组不感兴趣;你想要一个像素值数组

因此,首先您必须安装 Python 映像库。现代版本名为Pillow,文档中有完整的安装说明,但通常只是pip install pillow

现在,您可以在脚本中使用它了:

>>> from PIL import Image
>>> img = Image.open("temp.jpg")
>>> img.mode
'RGB'
>>> img.getpixel((0, 0))
(3, 148, 231)

Image 对象已经有点像数组了。 mode 让我知道这是一个 8 位 RGB 图像,因此每个像素将有 3 个值——从 0 到 255 的红色、绿色和蓝色强度。getpixel((0, 0)) 返回红色、绿色和左上角像素的蓝色值。

如果你真的想要一个平面数组,你也可以这样做:

>>> img.getdata()[0]
(3, 148, 231)

或者,如果您想要一个扁平的字节数组(交替的红-蓝-绿-红-蓝-绿)而不是元组:

>>> img.getbytes()[0]
3

【讨论】:

以上是关于解释图像的字节数组的主要内容,如果未能解决你的问题,请参考以下文章

将 PIL 图像转换为字节数组?

图像到字节数组 - ExternalException

将多字节数组图像数据合并为一个字节数组数据,并将WriteAllBytes合并为单个图像输出

字节数组到图像对象

在 Qml 中从字节数组加载到图像

图像到字节数组到字符串(反之亦然)