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) 编辑 收藏 举报