我使用的是Visual c++6。0技术内幕里提供的类CDib来操作位图,最好提供可以两个独立的函数来分辨别实现着俩个功能。他们可以作为CDib类的成员函数来使用。类似下面的这个就可以,我用了下面的这个,但是下面这个不好用,处理后的图象有许多问题,不能实现灰度化。
/*
此函数实现由24位的bmp到256色灰度图的转换
*/
CDib& CDib::RgbToGray()
{
//判断dibFile是有效的24位真彩色位图
if(m_lpBMIH->biBitCount==24 && m_nColorTableEntries==0 && m_lpBMIH->biCompression==BI_RGB)//是真彩色位图
{//先只处理扩展的Windows DIB
if((m_lpBMIH)->biSize==40){
m_nColorTableEntries=256;//修改数据成员
m_lpBMIH->biBitCount=8;
DWORD RowLength=4*(((m_lpBMIH->biWidth)*(m_lpBMIH->biBitCount)+31)/32);
m_dwSizeImage=RowLength*(m_lpBMIH->biHeight);
//分配一段保存256灰度位图的颜色表和实际位图的空间
DWORD NewBufSize=(DWORD)(256*sizeof(RGBQUAD)+RowLength*(m_lpBMIH->biHeight));
HGLOBAL hNewP