首先,要先了解一下bmp图片的格式。所谓的真彩图,即位深为24位的bmp图片,每个像素用三个字节表示,使得色彩更加丰富,真彩图不带调色板,原因是因为呢,真彩图用RGB三字节来表示即可,而调色板不是不可行,而是调色板结构体除了RGB之外还预留了一个字节,用此方法表示的话,就使得图片变得比较大了,不可取。
那么我们的流程该怎么走呢?
1.打开一个已知路径下的图片文件(bmp格式)。如:
CFileDialog filedlg(TRUE, NULL, NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("图像(*.bmp)|*.bmp"));
FILE *finput;;
finput = _tfopen(path,_T("rb+"));
2.定义位图信息头,以及位图文件头结构体,读取位图数据:
BITMAPFILEHEADER bmfh; //位图文件头
BITMAPINFOHEADER bmih; //位图信息头
fread(&bmfh,sizeof(BITMAPFILEHEADER),1,finput);//读取文件头
fread(&bmih,sizeof(BITMAPINFOHEADER),1,finput);//读取信息头
fread(buf,1,Size,finput);//Size即数据大小,buf指缓存
3. 根据公式 color = 0.299*r+0.587*g+0.114*b灰化
for(unsigned long k=0;k<Size;k=k+3)
{
*(buf+k)=*(buf+k+1)=*(buf+k+2)=(*(buf+k)*0.299+*(buf+k+1)*0.587+*(buf+k+2)*0.114);
}
4.重新把文件数据写入一个文件,即可看到灰化效果咯。。。
DEMO地址:http://download.csdn.net/detail/chenfanfanwin/5289145