我正在努力学习(通过自己和堆栈溢出的帮助)读取打包和分发的二进制数据。我这么做是出于强烈的好奇心,但我必须事先说,我在这一领域没有受过适当的教育,我所知道的一切都是我在网络上发现的,也是一种尝试/错误的工作。
为了准备这项工作,我在photoshop中制作了几个简单的1像素32位文件,用不同的颜色进行测试和比较,并帮助我区分不同的字节和位。并开始梳理维基百科和msdn位图网页。
我在页眉的DIB部分用4字节的压缩“插槽”点击了“路障”。
我所做的临时函数返回值为6的小endian中的整数。
以下是功能:
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算法进行压缩。16 The和32 The图像总是未经压缩而存储的。请注意,如果需要的话,所有颜色深度的图像都可以不受压缩地存储。
在msdn网页上写着:
BMP是Windows用来存储与设备无关和与应用无关的图像的标准格式.给定BMP文件的每像素(1、4、8、15、24、32或64)的位数在文件头中指定。BMP文件每像素24位是常见的。BMP文件通常不被压缩,因此不适合在Internet上传输。
所以,它通常不会压缩..。那么6代表什么呢?“这里什么都没发生,继续.”?
所以我的问题是:
是否有某种标准化的图像压缩编码?能帮我导航这些字节槽吗?我可以稍后再详细研究。有没有人有任何链接或书籍可以指导我在这方面的进一步探索?
发布于 2017-05-18 19:51:14
因此,首先,我需要寻找字节30,而不是34。第二,凯文太客气了,他没有向我指出维基百科上的具体章节,它说的下一件事。
压缩方法(偏移量30)可以是:
0 :> BI_RGB : the file has no compression
1 :> BI_RLE8 : Run length encoding ( 1 byte per pixel ) -> RLE
2 :> BI_RLE4 : Run length encoding ( nibble per pixel ) -> RLE
3 :> BI_BITFIELDS : Huffman 1D
4 :> BI_JPEG : RLE-24
5 :> BI_PNG : BITMAPV4INFOHEADER+: PNG image for printing
6 :> BI_ALPHABITFIELDS : RGBA fields ( byte per field, sooo 1 byte per color )
7 :> BI_CMYK : cmyk
11 :> BI_CMYKRLE8: RLE-8
12 :> BI_CMYKRLE4 RLE-4因此,由于我从压缩槽中获得了值6,所以我知道我需要在没有压缩的情况下将像素网格读取为RGBA。
https://stackoverflow.com/questions/43921785
复制相似问题