scanf(\
pfile = fopen(strFile,\打开文件
if(pfile!=NULL) {
printf(\//读取位图文件头信息 WORD fileType;
fread(&fileType,1,sizeof(WORD),pfile); if(fileType != 0x4d42) {
printf(\return; }
//fseek(pfile,2,SEEK_CUR); // \
fread(&bitHead,1,sizeof(tagBITMAPFILEHEADER),pfile);
showBmpHead(&bitHead); printf(\
//读取位图信息头信息
fread(&bitInfoHead,1,sizeof(BITMAPINFOHEADER),pfile); showBmpInforHead(&bitInfoHead); printf(\} else {
printf(\return; }
tagRGBQUAD *pRgb ;
if(bitInfoHead.biBitCount < 24)//有调色板 {
//读取调色盘结信息
long nPlantNum = long(pow(2,double(bitInfoHead.biBitCount))); // Mix color Plant Number; pRgb=(tagRGBQUAD *)malloc(nPlantNum*sizeof(tagRGBQUAD)); memset(pRgb,0,nPlantNum*sizeof(tagRGBQUAD)); int num = fread(pRgb,4,nPlantNum,pfile);
printf(\
printf(\颜色板信息:\\n\for (int i =0; i if (i%5==0) { printf(\} showRgbQuan(&pRgb[i]); } printf(\ } int width = bitInfoHead.biWidth; int height = bitInfoHead.biHeight; //分配内存空间把源图存入内存 int l_width = WIDTHBYTES(width* bitInfoHead.biBitCount);//计算位图的实际宽度并确保它为32的倍数 BYTE *pColorData=(BYTE *)malloc(height*l_width); memset(pColorData,0,height*l_width); long nData = height*l_width; //把位图数据信息读到数组里 fread(pColorData,1,nData,pfile); //将位图数据转化为RGB数据 tagRGBQUAD* dataOfBmp; dataOfBmp = (tagRGBQUAD *)malloc(width*height*sizeof(tagRGBQUAD));//用于保存各像素对应的RGB数据 memset(dataOfBmp,0,width*height*sizeof(tagRGBQUAD)); if(bitInfoHead.biBitCount<24)//有调色板,即位图为非真彩色 { int k; int index = 0; if (bitInfoHead.biBitCount == 1) { for(int i=0;i BYTE mixIndex= 0; k = i*l_width + j/8;//k:取得该像素颜色数据在实际数据数组中的序号 //j:提取当前像素的颜色的具体值 mixIndex = pColorData[k]; switch(j%8) { case 0: mixIndex = mixIndex<<7; mixIndex = mixIndex>>7; break; case 1: mixIndex = mixIndex<<6; mixIndex = mixIndex>>7; break; case 2: mixIndex = mixIndex<<5; mixIndex = mixIndex>>7; break; case 3: mixIndex = mixIndex<<4; mixIndex = mixIndex>>7; break; case 4: mixIndex = mixIndex<<3; mixIndex = mixIndex>>7; break; case 5: mixIndex = mixIndex<<2; mixIndex = mixIndex>>7; break; case 6: mixIndex = mixIndex<<1; mixIndex = mixIndex>>7; break; case 7: mixIndex = mixIndex>>7; break; } //将像素数据保存到数组中对应的位置 dataOfBmp[index].rgbRed = pRgb[mixIndex].rgbRed; dataOfBmp[index].rgbGreen = pRgb[mixIndex].rgbGreen; dataOfBmp[index].rgbBlue = pRgb[mixIndex].rgbBlue; dataOfBmp[index].rgbReserved = pRgb[mixIndex].rgbReserved; index++; } } if(bitInfoHead.biBitCount==2) { for(int i=0;i BYTE mixIndex= 0; k = i*l_width + j/4;//k:取得该像素颜色数据在实际数据数组中的序号 //j:提取当前像素的颜色的具体值 mixIndex = pColorData[k]; switch(j%4) { case 0: mixIndex = mixIndex<<6; mixIndex = mixIndex>>6; break; case 1: mixIndex = mixIndex<<4; mixIndex = mixIndex>>6; break; case 2: mixIndex = mixIndex<<2; mixIndex = mixIndex>>6; break; case 3: mixIndex = mixIndex>>6; break; }