比如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); 知道了帮忙解释下?谢谢!!!!!
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); 知道了帮忙解释下?谢谢!!!!!
我想是因为高于256色的DIB位图,每一个象素中就有颜色信息,不需要调色板,而低于256色的DIB象素的颜色需要和调色板对应,两者象素不一样的性质,所以要改变图象数据.至于具体公式我也不知道为什么,你可能可以从相关书上看到.
而低于256色的DIB象素的颜色需要和调色板对应,两者象素不一样的性质,所以要改变图象数据.我认为底于256色的DIB图象仅需调整调色板就可以!
是不是这样呀?大家知道的说下呀?谢谢!
0.114,0.587,0.299 是RGB转会度的经验参数。24位转256色,不是那么容易。需要计算如何取色,如何转换...