8位彩图灰度化可不可以只改调色板
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;
}
}
问题点数:0、回复次数:11Top
1 楼mengxiang2003(blog.sina.com.cn/fantasyfly)回复于 2005-04-02 16:16:36 得分 0
忘了,这一句应该去掉。BYTE gray = (red * 30 + green * 59 + blue * 11) / 100;
Top
2 楼sxshao(sxshao)回复于 2005-04-02 16:29:19 得分 0
八位彩图灰度化可以只改调色板,
——
看你如何定义和检验256灰度的了,要是严格检查调色板的话就不行。Top
3 楼mengxiang2003(blog.sina.com.cn/fantasyfly)回复于 2005-04-02 18:01:06 得分 0
sxshao(邵世鑫) :不好意思,你能不能说的详细点,我不太明白Top
4 楼huanyun(无妻徒刑)回复于 2005-04-02 22:46:03 得分 0
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=gray ;
(quad+i)->rgbGreen=gray ;
(quad+i)->rgbRed=gray ;
}
}
Top
5 楼KarlYung(Karl)回复于 2005-04-04 09:04:08 得分 0
当然可以!
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);Top
6 楼nicfeng(石头)回复于 2005-04-04 12:59:36 得分 0
把rgb调色板索引 改成gray索引就行了
Top
7 楼sxshao(sxshao)回复于 2005-04-07 10:29:36 得分 0
八位彩图灰度化可以只改调色板,
——
看你如何定义和检验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]++;
}
}
}
//Top
8 楼sxshao(sxshao)回复于 2005-04-07 10:36:58 得分 0
如果偷懒八位彩图灰度化仅仅改调色板,
之后的图像处理还是要查调色板,
效率不高。
一般来说,应严格定义和检验256灰度。
Top
9 楼hhoking(妙手仁心)回复于 2005-04-08 10:10:16 得分 0
效率问题嘛,如果想做通用函数(比如,不管8位是灰度还是彩色),效率已经损失了,所以也没什么影响。Top
10 楼kunlunlang(啊庸)回复于 2005-04-09 03:54:54 得分 0
不过这样灰化的效果不好Top
11 楼mengxiang2003(blog.sina.com.cn/fantasyfly)回复于 2005-04-10 19:48:05 得分 0
谢谢各位,我决定把24位的彩色图转化成8位的灰度图,创建一个调色板
for(i=0;i<256;i++)
{
(quad+i)->rgbBlue=(BYTE)i;
(quad+i)->rgbGreen=(BYTE)i;
(quad+i)->rgbRed=(BYTE)i;
}
然后把像素重新赋值gray.这样以后就不用管调色板了。Top




