【发布时间】:2017-10-10 19:58:31
【问题描述】:
我正在尝试学习(通过我自己和 stackoverflow 的帮助)在打包和分发二进制数据时读取它们。我这样做是出于好奇,但我必须提前说,我没有在这个领域接受过适当的教育,我所知道的一切都是我在网上找到的和试错类的工作。
为了准备这项工作,我在 Photoshop 中制作了几个简单的 1 像素 32 位文件,用不同的颜色进行测试和比较,并帮助我区分不同的字节和位。并开始梳理 wikipedia 和 msdn 位图网页。
“文学”如果有人好奇 BMP/DIB header MSDN web page
我在标题的 DIB 部分中使用 4 个字节的压缩“槽”击中了“路障”。
我制作的临时函数返回值为 6 的小端整数。
这里是函数:
def BMP_compresion(fileobj): # bitmap compresion ??? i have no idea what the hell is this
fileobj = manageFile(fileobj)
fileobj.seek(34)
comp = fileobj.read(4)
toStart(fileobj) # returns the file to position 0 or closes the file if file needs to be closed
return readNUMB(comp,False) # reads integer with struct.unpack
这个功能目前是临时的,正如之前所说的,我还在搞清楚。
现在我明白像素必须从原始文件像素定义转换(并且可能压缩),但我不知道 6 应该代表什么?
我什至认为这可能是错误的,“压缩”本身是一种压缩格式,当它转换为 bmp 时从另一种类型的图像传递过来(例如:1 - PNG、2-JPEG 等) .
我什至认为我把它弄错了,而不是让它成为整数,我应该得到原始二进制文件,这应该告诉我一些事情。
二进制:\x06\x00\x00\x00
作为二进制字符串:◦◦◦
这让我更加困惑。
在维基百科的文章中说:
索引彩色图像可以使用 4 位或 8 位 RLE 或 Huffman 1D 算法进行压缩。 OS/2 BITMAPCOREHEADER2 24bpp 图像可以使用 24 位 RLE 算法进行压缩。 16bpp 和 32bpp 图像始终未压缩存储。 请注意,如果需要,所有颜色深度的图像都可以在不压缩的情况下存储
在 msdn 网页中它说:
BMP BMP 是 Windows 用来存储独立于设备和独立于应用程序的图像的标准格式。给定 BMP 文件的每像素位数(1、4、8、15、24、32 或 64)在文件头中指定。每像素 24 位的 BMP 文件很常见。 BMP 文件通常不经过压缩,因此不太适合通过 Internet 传输。
所以,它通常不会被压缩……那么 6 代表什么? “这里什么都没发生,继续……”?
所以我的问题是:
是否有一些用于图像压缩的标准化代码? 可以帮助我通过这些字节槽进行导航吗?以后可以详细研究。 有没有人有任何链接或书籍可以指导我进一步完成这个任务?
【问题讨论】:
-
当您编写
fileobj.seek(34)时,您是如何决定应该在文件中查找 34 个字节以获取 DIB 标头的?根据en.wikipedia.org/wiki/BMP_file_format,它是 14 个字节,而不是 34 个。 -
压缩槽是在DIB头而不是BMP部分,所以实际上是在34号。在图像“upload.wikimedia.org/wikipedia/commons/c/c4/BMPfileFormat.png”中,您可以查看 DIB 标头,这是我用来参考的。我使用图像底部的字节偏移来导航。在我弄清楚如何为其创建一个函数来减轻我的痛苦之前,我会计算每个字节。
-
不应该是30吧? BMP header是14,然后DIB header size、image width、image height、planes和bits per pixel是16,一共30。
-
好吧,我之前提到的 1 个像素图像,我会告诉你 BMP、DIB 和像素网格的大小整个文件:76 字节 BMP 头部:14 字节 DIB 头部:56 字节像素网格:4字节EOF:2字节
标签: python bitmap header bmp dib