我正在尝试(通过我自己和stackoverflow的帮助)学习打包和分发二进制数据。我这样做是为了剪切好奇心,但我必须提前说我没有从这个领域接受适当的学校教育,我所知道的就是我在网上找到的和试验/错误的工作。
为了准备这项工作,我在不同颜色的photoshop中制作了几个简单的1像素32位文件进行测试和比较,并帮助我区分不同的字节和位。并开始梳理维基百科和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或霍夫曼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代表什么? "这里没有任何事情发生,继续......" ?
所以我的问题是:
是否有一些标准化的图像压缩代码? 通过这些字节插槽可以帮助我导航?我稍后可以详细研究它。 有没有人有任何链接或书籍可以在这个任务中进一步指导我?
答案 0 :(得分:0)
首先,我需要寻找第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读取而不进行压缩。