颜色降色的问题

yuucyf 2008-01-15 12:19:50
比如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);

知道了帮忙解释下?谢谢!!!!!
...全文
164 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
buggycode 2008-01-17
  • 打赏
  • 举报
回复
你的代码应该是转灰度。
0.114,0.587,0.299 是RGB转会度的经验参数。

24位转256色,不是那么容易。需要计算如何取色,如何转换...

yuucyf 2008-01-16
  • 打赏
  • 举报
回复
4色的图象的数据是索引值,并不是RGB的值!

底于256色的DIB图象转化为其他小于256色的图象仅需调整调色板就可以?
是不是这样呀?大家知道的说下呀?谢谢!
lzr4304061988012 2008-01-15
  • 打赏
  • 举报
回复
我想是因为高于256色的DIB位图,每一个象素中就有颜色信息,不需要调色板,而低于256色的DIB象素的颜色需要和调色板对应,两者象素不一样的性质,所以要改变图象数据.至于具体公式我也不知道为什么,你可能可以从相关书上看到.
lzr4304061988012 2008-01-15
  • 打赏
  • 举报
回复
图象的数据就是象素的具体数据,两种图象素数据表达的东西都不一样,转换的时候肯定要改变数据.
askLover 2008-01-15
  • 打赏
  • 举报
回复
问者多答,答者必问,顶为答,答为问,踩顶到此
yuucyf 2008-01-15
  • 打赏
  • 举报
回复
to:
我想是因为高于256色的DIB位图,每一个象素中就有颜色信息,不需要调色板,而低于256色的DIB象素的颜色需要和调色板对应,两者象素不一样的性质,所以要改变图象数据.至于具体公式我也不知道为什么,你可能可以从相关书上看到.


而低于256色的DIB象素的颜色需要和调色板对应,两者象素不一样的性质,所以要改变图象数据.

我认为底于256色的DIB图象仅需调整调色板就可以!

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧