在操作BMP中碰到的问题:BMP头部信息与字节对齐
ckfan
posted @ 2012年11月05日 14:40
in 技术blog
, 2663 阅读
今天在进行对一张单色bmp读取数据时,碰到了挺多的问题。 这里总结下。 1.对BMP的头部信息了解有误。BMP包含图像文件头,图像由于BMP中信息头,调色板数据,图像数据。 这里调色板数据的大小为N*4byte.这里需要注意的是调试板并不是所有的图片都有调试板的,需要取 决于biCompression,当biCompression成员的值是BI_RGB时,它没有调色板。而且biBitCount大 等于24的时候,没有调试版,biBitCount为32的时候,biCompression为BI_RGB时,没有调试板, 为BI_BITFIELDS原来调色板的位置将被三个DWORD变量占据,成为红、绿、蓝掩码,分别用于描述红、 绿、蓝分量在32位中所占的位置。具体的BMP的调试板相关问题就到这里,详细信息MSDN(BITMAPINFOHEADER), 如果想中文版的,可以百科http://baike.baidu.com/view/189487.htm 2.字节对齐问题 // 位图文件头 typedef struct tagBITMAPFILEHEADER { int16u bfType; // 位图文件的类型,必须为BM int32u bfSize; // 位图文件的大小,以字节为单位 int16u bfReserved1; // 位图文件保留字,必须为0 int16u bfReserved2; // 位图文件保留字,必须为0 int32u bfOffBits; // 位图数据的起始位置,以相对于位图 // 文件头的偏移量表示,以字节为单位 }BITMAPFILEHEADER; /*test.bmp 头部HEX 00000000h: 42 4D FE 3F 00 00 00 00 00 00 3E 00 00 00 28 00 ; BM?......>...(. 00000010h: 00 00 80 01 00 00 54 01 00 00 01 00 01 00 00 00 ; ..€...T......... 00000020h: 00 00 C0 3F 00 00 00 00 00 00 00 00 00 00 00 00 ; ..?............ 00000030h: 00 00 00 00 00 00 FF 00 00 00 00 00 FF 00 ; ............ */ code: fs.open("./test.bmp", ios::in); if(fs.is_open() == false) { printf("\r\n TestMid: open print_header.tmp failed... \r\n"); continue; } // 读取位图文件头 memset(&file_header, 0, sizeof(BITMAPFILEHEADER)); fs.read((char*)&file_header, 14); fs.seekg(file_header.bfOffBits); fs.read(...); .... 可是每次数据读出来什么都没有,加了各种调试信息。后面发现file_header.bfOffBits 为0, 这时候我就奇怪了......后面才想起字节对齐问题,平时也了解了字节对齐相关问题, 但是在实际编程中还是忽略了。 解决上面的问题: 方法一: fs.read((char*)&file_header.bfType, 2); fs.read((char*)&file_header.bfSize, 4); fs.read((char*)&file_header.bfReserved1, 2); fs.read((char*)&file_header.bfReserved2, 2); fs.read((char*)&file_header.bfOffBits, 4); 方法二: #pragma pack(1) /*指定按1字节对齐*/ // 位图文件头 typedef struct tagBITMAPFILEHEADER { int16u bfType; // 位图文件的类型,必须为BM int32u bfSize; // 位图文件的大小,以字节为单位 int16u bfReserved1; // 位图文件保留字,必须为0 int16u bfReserved2; // 位图文件保留字,必须为0 int32u bfOffBits; // 位图数据的起始位置,以相对于位图 // 文件头的偏移量表示,以字节为单位 }BITMAPFILEHEADER; #pragma pack()// 恢复 这里就不再重复字节问题了,具体可以见这个BLOG:http://www.cnblogs.com/logogcn/archive/2010/11/30/1891699.html,写的很好。
2024年1月16日 15:23
Excellent points?I would notice that as someone who in reality doesn’t write on blogs a lot (actually, this can be my first publish), I don’t assume th