BMP位图读取部分代码

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
读取BMP文件的位图数据,你可以按照以下步骤进行操作: 1. 打开BMP文件:使用合适的文件读取函数,如`fopen`来打开BMP文件,并确保成功打开文件。 2. 解析BMP文件头:BMP文件的前14个字节是文件头,其中包含了一些关于图像的基本信息,如文件类型、文件大小等。你可以使用结构体来解析文件头数据,例如: ```c typedef struct { unsigned short type; // 文件类型 unsigned int size; // 文件大小 unsigned short reserved1; // 保留字段 unsigned short reserved2; // 保留字段 unsigned int offset; // 数据偏移量 } BMPHeader; ``` 使用`fread`函数将文件头数据读取到这个结构体中。 3. 解析BMP信息头:紧接着文件头后面的40个字节是BMP信息头,包含了图像的宽度、高度、位深度等信息。同样使用结构体来解析这部分数据,例如: ```c typedef struct { unsigned int size; // 信息头大小 int width; // 图像宽度 int height; // 图像高度 unsigned short planes; // 颜色平面数 unsigned short bitCount; // 每个像素的位数 unsigned int compression; // 压缩类型 unsigned int imageSize; // 图像数据大小 int xPixelsPerMeter; // 水平分辨率 int yPixelsPerMeter; // 垂直分辨率 unsigned int colorsUsed; // 使用的颜色数 unsigned int colorsImportant; // 重要颜色数 } BMPInfoHeader; ``` 同样使用`fread`函数将信息头数据读取到这个结构体中。 4. 解析位图数据位图数据紧跟在信息头之后,根据位深度的不同,数据解析方式也会有所不同。对于常见的24位真彩色图像,每个像素由红、绿、蓝三个通道组成,每个通道占用一个字节,按照从左到右、从上到下的顺序排列。你可以使用一个二维数组来存储图像的像素数据,例如: ```c unsigned char** imageData = (unsigned char**)malloc(sizeof(unsigned char*) * height); for (int i = 0; i < height; i++) { imageData[i] = (unsigned char*)malloc(sizeof(unsigned char) * width * 3); fread(imageData[i], sizeof(unsigned char), width * 3, file); } ``` 注意,这里假设图像的宽度是4的倍数,如果不是,需要对每行的像素数据进行对齐处理。 5. 关闭文件:读取位图数据后,记得关闭文件,释放内存。 以上是读取BMP文件位图数据的基本步骤,你可以根据需要进行进一步处理和操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值