颜色降色的问题
比如24色降成8色是这样:
Code:
void CMainDoc::Convert24to8(HDIB hdib)
{
DWORD dwLen;
BYTE *ptr1;
BYTE *ptr2;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
HANDLE hTempImage = NULL;
LPRGBQUAD lprgb;
register int j,i;
if( hdib == 0 )
return ;
dwLen = GlobalSize (hdib);
DibInfo (hdib, &bi);
if(bi.biBitCount!=24)
return;
bi.biWidth = (WORD)( (bi.biWidth + 3) /4 ) * 4;
dwLen = bi.biSize + 1024+bi.biHeight*bi.biWidth;
hTempImage = ::GlobalAlloc(GHND, dwLen);
ptr1 = (BYTE *)GlobalLock(hdib);
ptr2 = (BYTE *)GlobalLock(hTempImage);
lpbi = (LPBITMAPINFOHEADER)ptr2;
lpbi->biSizeImage = bi.biHeight*bi.biWidth;
lpbi->biPlanes = bi.biPlanes;
lpbi->biSize = bi.biSize;
lpbi->biWidth = bi.biWidth;
lpbi->biHeight = bi.biHeight;
lpbi->biClrUsed = 256;
lpbi->biBitCount = 8;
ptr2 += bi.biSize ;
lprgb = (LPRGBQUAD)ptr2;
for( j=0;j<256;j++,lprgb++ )
{
lprgb->rgbBlue = j; // fill in 256 gray
lprgb->rgbGreen = j;
lprgb->rgbRed = j;
lprgb->rgbReserved = 0;
}
ptr1 += bi.biSize;
ptr2 += 1024;
//Y = 0.299*R + 0.587*G + 0.114*B
for( j=0;j<bi.biHeight*bi.biWidth;j++ )
{
*ptr2 = (int)((*ptr1)*0.114 + (*(ptr1+1))*0.587 + (*(ptr1+2))*0.299);
ptr1+=3 ;
ptr2++;
}
GlobalUnlock(hTempImage);
GlobalFree(hdib);
hdib = (HDIB)CopyHandle(hTempImage );
GlobalFree(hTempImage);
}
下面这一行不明白,为什么?
降色的时候只是调色盘变了,为什么图片数据也要更改呢?而且为什么是0.114,0.587,0.299?
*ptr2 = (int)((*ptr1)*0.114 + (*(ptr1+1))*0.587 + (*(ptr1+2))*0.299);
知道了帮忙解释下?谢谢!!!!!