#define WIDTHBYTES(bits) (((bits)+31)/32*4)
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER infoHeader;
tagRGBQUAD *tagRgb;
FILE* pfin =fopen("liu.bmp","rb");
//Read the Bitmap file header;
fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,pfin);
//Read the Bitmap info header;
fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,pfin);
long nPlantNum = long(pow(2,double(infoHeader.biBitCount))); // Mix color Plant Number;
tagRgb=(tagRGBQUAD *)malloc(nPlantNum*sizeof(tagRGBQUAD));
memset(tagRgb,0,nPlantNum*sizeof(tagRGBQUAD));
int num = fread(tagRgb,4,nPlantNum,pfin);
//fread(&tagRgb,sizeof(tagRGBQUAD),1,pfin);
int height=infoHeader.biHeight;
int width=infoHeader.biWidth;
//分配内存空间把源图存入内存
int l_width = WIDTHBYTES(width* infoHeader.biBitCount);//计算位图的实际宽度并确保它为32的倍数
BYTE *pColorData=(BYTE *)malloc(height*l_width);
memset(pColorData,0,height*l_width);
long nData = height*l_width;
//把位图数据信息读到数组里
fread(pColorData,1,nData,pfin);
//unsigned int * buffers=(unsigned int *)malloc(size*sizeof(unsigned int));
//将位图数据转化为RGB数据
RGBQUAD* pRawRgbData;
pRawRgbData = (tagRGBQUAD *)malloc(width*height*sizeof(tagRGBQUAD));//用于保存各像素对应的RGB数据
memset(pRawRgbData,0,width*height*sizeof(tagRGBQUAD));
//(*ppRawRgbData)=pRawRgbData;
int k=0;
int index=0;
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
BYTE mixIndex= 0;
k = i*l_width + j/2;
mixIndex = pColorData[k];
if(j%2==0)
{//低
mixIndex = mixIndex<<4;
mixIndex = mixIndex>>4;
}
else
{//高
mixIndex = mixIndex>>4;
}
// pRawRgbData[index].rgbRed = tagRgb[mixIndex].rgbRed;
pRawRgbData[index].rgbRed = tagRgb[mixIndex].rgbBlue;
pRawRgbData[index].rgbGreen = tagRgb[mixIndex].rgbGreen;
pRawRgbData[index].rgbBlue = tagRgb[mixIndex].rgbRed;
//pRawRgbData[index].rgbBlue = tagRgb[mixIndex].rgbBlue;
//pRawRgbData[index].rgbReserved = tagRgb[mixIndex].rgbReserved;
pRawRgbData[index].rgbReserved =255;
index++;
}
}