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/