Bmp格式图片与16进制的互相转换简解 Python

BMP TO HEX

首先介绍Github上一个简单的Bmp转成16进制的py:

https://github.com/robertgallup/bmp2hex

网上这种例子很多。思路也简单:将bmp文件一个个二进制进行分析,这里的1-2表示2个字节,16个二进制数据,0xXXXX四位16进制数据~:
————————————————

11-2:(这里的数字代表的是字节,下同)图像文件头。0x4d42=’BM’,表示是Windows支持的BMP格式。(注意:查ascii表B 0x42,M0x4d,bfType 为两个字节,B为low字节,M为high字节所以bfType=0x4D42,而不是0x424D,请注意)
23-6:整个文件大小。4690 0000,为00009046h=3693437-8:保留,必须设置为0。
49-10:保留,必须设置为0。
511-14:从文件开始到位图数据之间的偏移量(14+40+4*(2^biBitCount))(在有颜色板的情况下)。4600 0000,为00000046h=70,上面的文件头就是35字=70字节。
位图信息头
615-18:位图图信息头长度。
7) 19-22:位图宽度,以像素为单位。8000 0000,为00000080h=128823-26:位图高度,以像素为单位。9000 0000,为00000090h=144927-28:位图的位面数,该值总是1。0100,为0001h=11029-30:每个像素的位数。有1(单色),416色),8256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色)。1000为0010h=161131-34:压缩说明:有0(不压缩),1(RLE 88位RLE压缩),2(RLE 44位RLE压缩,3(Bitfields,位域存放)。RLE简单地说是采用像素数+像素值的方式进行压缩。T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。图中0300 0000为00000003h=3(这张图片不存在颜色板)。
1235-38:用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于:一行所占的字节数×位图高度。0090 0000为00009000h=80×90×2h=36864。假设位图是24位,宽为41,高为30,则数值= (biWidth*biBitCount+31)/32*4*biHeight,即=(41*24+31)/32*4*30=3720
1339-42:用象素/米表示的水平分辨率。A00F 0000为0000 0FA0h=40001443-46:用象素/米表示的垂直分辨率。A00F 0000为0000 0FA0h=40001547-50:位图使用的颜色索引数。设为0的话,则说明使用所有调色板项。
1651-54:对图象显示有重要影响的颜色索引的数目。如果是0,表示都重要。
彩色板
17)(55+0)到(50-1+2^biBitCount):彩色板规范。对于调色板中的每个表项,用下述方法来描述RGB的值:
1字节用于蓝色分量
1字节用于绿色分量
1字节用于红色分量
1字节用于填充符(设置为0)

HEX TO BMP

如果你想要手写一个Bmp,按照上面的格式去写吧,祝你好运!

而我已经有了一个16进制的数据,转一下就可以!如下:

data0 = "424DD6020000000000003600000028000000100000000E0000000100180000000000A002000000000000000000000000000000000000FFFFFFFFFFFFD6DEEFA59C9C6B5A5A736363736363736363736363736363736363736363AD9C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF849CE7848CB56B5A5A2108002108002108002108002108002108002108006B5252FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEE7F7215AEF6B84D69494A5634A4A4A31294A31294A31294A31294231298C7B7BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9CB5EF104AE72963E794A5D6F7F7F7FFFFFFFFFFFFFFF7F7FFF7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A73E7104ADE104AE74A7BEFCED6F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6DEF71852DE104ADE104ADE104ADE7394EFE7EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94ADEF396BDE396BDE396BDE3163DE5A84E7CED6F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6DEF77394EF7394EF7394EF7394E76B8CE7B5C6F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7FF396BDE104ADE104ADE104ADE2152DE9CB5EFF7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8CA5EF104ADE104ADE104ADE7394EFE7EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6DEF7184ADE104ADE4A7BEFCED6F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4273E7215AEF849CDEADADBDB5ADB5ADA59CAD9C9CAD9C9CAD9C9CCEC6C6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94ADF7527BE7A5A5C652424A2100002108002108002108002108002108006B5A5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5BDE79C94A54221212910083118183118183118183118183118183118187B736BFFFFFFFFFFFFFFFFFF"
with open("test.bmp", 'wb') as bmp_file:
    bmp_file.write(bytearray.fromhex(data))  # convert values to bytes

 这里我的数据看前4位!424D,就是bmp格式的说明咯。全部信息都在,不需要任何处理改变。而我傻傻地搜半天,~。~|||

原文地址:https://www.cnblogs.com/jijm123/p/11471282.html