Bmp文件操作(2)

在这里我所谓的Bmp文件操作主要是读取文件内某一位置的RGB信息。  

COLORREF RGB( BYTE byRed, // red component of color
 BYTE byGreen, // green component of color
 BYTE byBlue // blue component of color
);

 上一篇贴出BITMAPINFO的信息主要是先了解一下bmp头文件信息,主要成分是:

LONG biWidth;

LONG biHeight;

WORD biBitCount;

biWidth,biHeight一看就知道主要是文件的宽度与高度,(biWidth必须是4的倍数),其高度与宽度的单位便是像素,

那么像素的大小是什么,便是biBitCount所要交代的,它的取值可以为4,8,16,24,32,都是位数,而RGB里元素为BYTE

类型,所以要把他们变为字节,就需要 biBitCount/8 鉴于方便我们就处理 bibitCount的值为24的,24/8=3。

long LineByteWith;
     BYTE *Buffer;
     int pixeladd;
     RGB rgb;
     BITMAPFILEHEADER fileheader;
     BITMAPINFO info;

 void CReadBmpDlg::ReadBmp()
{
 FILE *fp=fopen("c:\\a.bmp","r");  
   fread(&fileheader,sizeof(fileheader),1,fp); //读取头文件信息
 
 if(fileheader.bfType!=0x4D42)
 {
  AfxMessageBox("无位图文件 请选择位图文件");
  fclose(fp);
  return ;
 }
    fread(&info.bmiHeader, sizeof(BITMAPINFOHEADER), 1, fp);      /*读取信息头*/
 UINT width=info.bmiHeader.biWidth;
 
 pixeladd=info.bmiHeader.biBitCount/8;
 width=width/4*4+4;
 LineByteWith=width*pixeladd;
 UINT height=info.bmiHeader.biHeight;                   //位图高度
 Buffer=(BYTE*)malloc(height*LineByteWith);   //位图的大小
 fseek(fp,fileheader.bfOffBits,0);                      //重定位流上的文件指针,接下来的操作将从新位置开始
 fread(Buffer,info.bmiHeader.biSizeImage,1,fp);
 fclose(fp);
 
}

 

 

void CReadBmpDlg::GetRDB(int x,int y,BYTE *r,BYTE *g,BYTE *b)
{
 BYTE* ptr;
   if(x>0&&x<info.bmiHeader.biWidth&&y>0&&y<info.bmiHeader.biHeight)
   {
    ptr=Buffer+x*pixeladd+(info.bmiHeader.biHeight-1-y)*LineByteWith;
 *b=*ptr;
 *g=*(ptr+1);
 *r=*(ptr+2);
   }

}

再为RGB各个变量赋值

posted on 2012-02-24 11:13  fanhongyue  阅读(269)  评论(0编辑  收藏  举报

导航