bmp 文件信息头biCompression参数

BITMAPINFO * bitmapInfo;
	bitmapInfo  = (BITMAPINFO*)malloc( sizeof(BITMAPINFO)+sizeof(RGBQUAD)*(255) );

	//printf("%d,%d\n",sizeof(BITMAPINFOHEADER),sizeof(BITMAPINFO));40,44

	memset( bitmapInfo, 0, sizeof(BITMAPINFO)+sizeof(RGBQUAD)*(255) );

	bitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);//位图信息头大小 40字节
	bitmapInfo->bmiHeader.biWidth = 800;
	bitmapInfo->bmiHeader.biHeight = -480;
	bitmapInfo->bmiHeader.biPlanes = 1;
	bitmapInfo->bmiHeader.biBitCount = 16;              //16位位图  565模式0xF800、0x07E0、0x001F
	bitmapInfo->bmiHeader.biCompression = BI_BITFIELDS; //压缩参数  BI_RGB=0表示无压缩
	bitmapInfo->bmiHeader.biSizeImage = 0;

	bitmapInfo->bmiColors[0].rgbBlue = 0;  
	bitmapInfo->bmiColors[0].rgbGreen = 0xF8;  //248?
	bitmapInfo->bmiColors[0].rgbRed = 0;  
	bitmapInfo->bmiColors[0].rgbReserved = 0;  

	bitmapInfo->bmiColors[1].rgbBlue = 0xE0;  //224
	bitmapInfo->bmiColors[1].rgbGreen = 0x07;  //7
	bitmapInfo->bmiColors[1].rgbRed = 0;  
	bitmapInfo->bmiColors[1].rgbReserved = 0;  

	bitmapInfo->bmiColors[2].rgbBlue = 0x1F;  //31
	bitmapInfo->bmiColors[2].rgbGreen = 0;  
	bitmapInfo->bmiColors[2].rgbRed = 0;  
	bitmapInfo->bmiColors[2].rgbReserved = 0;  

biBitCount=16  

当biCompression成员的值是BI_RGB时,它没有调色板。16位中,最低的5位表示蓝色分量,中间的5位表示绿色分量,高的5位表示红色分量,一共占用了15位,最高的一位保留,设为0。这种格式也被称作555   16位位图。

当biCompression成员的值是BI_BITFIELDS,那么情况就复杂了,首先是原来调色板的位置被三个DWORD变量占据,称为红、绿、蓝掩码。

分别用于描述红、绿、蓝分量在16位中所占的位置。在Windows   95(或98)中,系统可接受两种格式的位域:555和565;

在555格式下,红、绿、蓝的掩码分别是:0x7C00、0x03E0、0x001F,

而在565格式下,它们则分别为:0xF800、0x07E0、0x001F。

你在读取一个像素之后,可以分别用掩码“与”上像素值,从而提取出想要的颜色分量(当然还要再经过适当的左右移操作)。

引用:http://topic.csdn.net/t/20020911/20/1016000.html

ezhong的博客园:http://www.cnblogs.com/ezhong/

原文地址:https://www.cnblogs.com/ezhong/p/2239060.html