if(bi.biBitCount=8)
{
for(i=0;i<256;i++)
{
BYTE blue=(quad+i)->rgbBlue;
BYTE green=(quad+i)->rgbGreen;
BYTE red=(quad+i)->rgbRed;
BYTE gray = (red * 30 + green * 59 + blue * 11) / 100;
(quad+i)->rgbBlue=(BYTE)i;
(quad+i)->rgbGreen=(BYTE)i;
(quad+i)->rgbRed=(BYTE)i;
}
}
{
for(i=0;i<256;i++)
{
BYTE blue=(quad+i)->rgbBlue;
BYTE green=(quad+i)->rgbGreen;
BYTE red=(quad+i)->rgbRed;
BYTE gray = (red * 30 + green * 59 + blue * 11) / 100;
(quad+i)->rgbBlue=(BYTE)i;
(quad+i)->rgbGreen=(BYTE)i;
(quad+i)->rgbRed=(BYTE)i;
}
}
{
for(i=0;i<256;i++)
{
BYTE blue=(quad+i)->rgbBlue;
BYTE green=(quad+i)->rgbGreen;
BYTE red=(quad+i)->rgbRed;
BYTE gray = (red * 30 + green * 59 + blue * 11) / 100;
(quad+i)->rgbBlue=gray ;
(quad+i)->rgbGreen=gray ;
(quad+i)->rgbRed=gray ;
}
}
int MaxColors = imgOriginal.GetMaxColorTableEntries();
RGBQUAD* ColorTable;
ColorTable = new RGBQUAD[MaxColors]; imgOriginal.GetColorTable(0,MaxColors,ColorTable);
for (int i=0; i<MaxColors; i++)
{
int avg = (ColorTable[i].rgbBlue + ColorTable[i].rgbGreen + ColorTable[i].rgbRed)/3;
ColorTable[i].rgbBlue = (BYTE)avg;
ColorTable[i].rgbGreen = (BYTE)avg;
ColorTable[i].rgbRed = (BYTE)avg;
}
imgOriginal.SetColorTable(0,MaxColors,ColorTable);
delete(ColorTable);
——
看你如何定义和检验256灰度的了,要是严格检查调色板的话就不行。
//
//
比如:
//创建256色灰度调色板
for( i = 0; i < j; i++ )
{
pNewRGBPalette[i].rgbRed = i;
pNewRGBPalette[i].rgbGreen = i;
pNewRGBPalette[i].rgbBlue = i;
}
//
以后图像处理时就不用查调色板了。
//
// 统计
for ( y = nY * _TileYStep; y < (nY+1) * _TileYStep; y++ )
{
//数据指针定位到图像数据每行的起始零位置
pTemp =_p256g + (( _YHeight - 1 - y) * _nWidthBytes);
for ( x = nX * _TileXStep ; x < (nX+1) * _TileXStep; x++)
{
if (pTemp[x] == 0)
{
_pTilePixel[nI]++;
}
}
}//
for(i=0;i<256;i++)
{
(quad+i)->rgbBlue=(BYTE)i;
(quad+i)->rgbGreen=(BYTE)i;
(quad+i)->rgbRed=(BYTE)i;
}
然后把像素重新赋值gray.这样以后就不用管调色板了。