BMP位图读取部分代码

本文介绍了一段用于读取BMP格式图片文件的C语言代码,详细展示了如何解析BMP文件头、信息头及调色板信息,并将位图数据转化为RGB格式的过程。涉及内存分配、文件读写等关键技术。

 

#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++;
  }
 }
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值