BMP图像内容读取中的问题

在读取BMP图像内容的过程中,遇到了以下问题:
1. BMP主要分为BITMAPFILEHEADE文件头、BITMAPINFOHEADER信息头、RGBQUAD颜色表以及DIB(Device-Independent Bitmap)数据内容等四部分,具体结构可以MSDN,其中1、4、8、16位的图像分别拥有2^1=2、2^4=16、2^8=256、2^16=65536种颜色,每个颜色表项占4个字节,其DIB数据中存储的是颜色表中的索引值,24位真彩色及32位图像没有颜色表项,直接存储颜色的信息。
2. BITMAPFILEHEADE文件头占据14字节,但在读取内容时,sizeof(BITMAPFILEHEADE)的值为16,这是由于自己定义的结构体在内存中因为字节对齐(4字节的倍数),占用了16个字节,故如果直接使用fread函数则会直接读入16个字节,从而数据向后移动了2字节的位置,导致后面的数据错误,可以通过对文件头中各项数据逐一读取来解决,当然,存储为BMP文件时也需特别注意。
3. 在winhex中读入图片会发现,因为内存中的数据排列高位在左,低位在右,每一项数据都是颠倒的,譬如BITMAPFILEHEADER中的bfType恒为0x4D42,但会显示为0x424D,其余各项内容亦如此。
4. DIB数据内容中的数据是颠倒的,即从左下方描述至右上方的像素。
5. 在计算图像所占字节大小时,需要考虑到BMP中每一行的像素值需要为4的倍数,不足的用零补全,譬如一张24位3*3像素的图像,所占的字节数为:

14+40+434333=90B

你可能感兴趣的:(bmp,位图,内容读取,色位)