python BMP / DIB字节槽,压缩槽

时间:2017-05-11 17:11:26

标签: python bitmap header bmp dib

我正在尝试(通过我自己和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代表什么? "这里没有任何事情发生,继续......" ?

所以我的问题是:

是否有一些标准化的图像压缩代码? 通过这些字节插槽可以帮助我导航?我稍后可以详细研究它。 有没有人有任何链接或书籍可以在这个任务中进一步指导我?

1 个答案:

答案 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读取而不进行压缩。