你可以先创建调色版,把她转换成256色的。再把它的调色版中的RG值都设置成一样。
一共设置成256种就可以了。
void Cmdib::Change24bTo256()
{
//create a palette
PLOGPALETTE lp1=Make256Palette();
LPLOGPALETTE lp=(LPLOGPALETTE) &lp1;
//ask a palace to place new DIB (singal byte)
    DWORD dwNewBytes =ComputeRowBytes(m_lpBMIH->biWidth,8);
m_lpBMIH->biSizeImage= dwNewBytes * m_lpBMIH->biHeight; //whole image size
LPBYTE lpNewBi=(LPBYTE) new char[m_lpBMIH->biSizeImage]; LPBYTE lpNewImage=lpNewBi;
LPBYTE lpNewRow=lpNewImage;
LPBYTE lpOldImage=m_lpDIBits;
LPBYTE lpOldRow=lpOldImage;
//change old DIB color to value ,and place into new DIB
    DWORD dwOldBytes =ComputeRowBytes(m_lpBMIH->biWidth,m_lpBMIH->biBitCount); BYTE r,g,b;
int Item=0;
for(int h=0;h<m_lpBMIH->biHeight;h++)
{
lpOldRow=lpOldImage;
lpNewRow=lpNewImage;
for(int w=0;w<m_lpBMIH->biWidth;w++)
{
r=*lpOldRow;
g=*(lpOldRow+1);
b=*(lpOldRow+2);
Item=FindPaletteItem(lp,r,g,b);
*lpNewRow=Item;
lpOldRow+=3;
lpNewRow++;
}
lpOldImage+=dwOldBytes;
lpNewImage+=dwNewBytes;
}
//change infoheader
m_lpBMIH->biBitCount=8;
//create palette
::DeleteObject(m_hPalette);
m_hPalette=NULL;
m_hPalette = ::CreatePalette(lp);
lp=NULL;
lp1=NULL;
//set DIB point
delete [] m_lpDIBits;
m_lpDIBits=NULL;
m_lpDIBits=lpNewBi;
lpNewBi=NULL;
//NULL
lpNewImage=NULL;
lpNewRow=NULL;
lpOldImage=NULL;
lpOldRow=NULL;
//reset value
ComputeImage();
ComputePaletteSize(m_lpBMIH->biBitCount);
}