vc中,bitmap信息头中的颜色信息与dc中的调色板是什么关系?

来源:百度知道 编辑:UC知道 时间:2024/06/30 02:05:01
vc中,bitmap信息头中的颜色信息与dc中的调色板是什么关系?我利用原始数据和已有的256色颜色表在图像内存中构造了一个bitmap的信息头,而后利用256色颜色表的颜色构造一个调色板,但我不知道调色板和信息头中的颜色信息的关系是什么?既然构造出了调色板,那信息头中的颜色信息可以乱设置或置空吗?
好的,在创建信息头的过程中(我有16个256色的配色表,rgbStd256为配色表的数组)
for (i = 0; i<255; i++)
{
mg_lpBmpInf->bmiColors[i].rgbBlue =rgbStd256[k][i].rgbBlue;//
mg_lpBmpInf->bmiColors[i].rgbGreen = rgbStd256[k][i].rgbGreen;//
mg_lpBmpInf->bmiColors[i].rgbRed = rgbStd256[k][i].rgbRed;//
mg_lpBmpInf->bmiColors[i].rgbReserved = 0;

mg_pPal->palPalEntry[i].peRed=rgbStd256[ka][i].rgbRed;//
mg_pPal->palPalEntry[i].peGreen=rgbStd256[ka][i].rgbGreen;//
mg_pPal->palPalEntry[i].peBlue= rgbStd256[ka][i].rgbBlue;//
mg_pPal->palPalEntry[i].peFlags=0;
}
mg_palDIB->CreatePalette(mg_pPal);
---
我处理的数据实际上是从单色CCD中直接读出的一维数组,数组中的每一个元素代表一个像素的强度,它仅是数据,所以我才需要人工添加信息头。
我刚才按照您的说法注释了mg_lpBmpInf->b

信息头中的调色板信息是让我们创建调色板用的。调色板创建完了,必须要选到DC中,并且DC要实现RealizePalette才行。

如果不按照信息头中的调色板信息,自己胡乱设置调色板,然后选到DC中。那么最后RealizePalette,会和原来BMP文件显示的图片颜色一样吗??

还是会一样,图片不会失真。

呵呵,开了个玩笑,之所以不会失真,是因为现在的显卡都不需要我们自己设置调色板了。楼主可以试下:
BOOL fOk = ((RC_PALETTE & pDC->GetDeviceCaps(RASTERCAPS)) != 0);

fOk应该是0。因此,如果要考虑调色板的问题,首先应该先用上面的代码判断DC是否支持调色板,不支持的话,关于调色板的代码都是无意义的。RealizePalette永远返回0!
但信息头中的调色板信息不能乱改的,DC会直接使用里面的RGBQUAD。当然前提是要有RGBQUAD。
-------------------------------------------
请贴一下代码
-------------------------------------------
呵呵,楼主把RGBQUAD给改了!
开始我就说了,RGBQUAD是不能改的,改了会影响颜色显示的。
看下你的代码:
mg_lpBmpInf->bmiColors[i].rgbBlue =rgbStd256[k][i].rgbBlue;
bmiColors是属于DIB的,也就是BITMAPINFO的一部分,是属于BMP文件(DIB)所有 。改了这部分后,颜色肯定会不一样。楼主可以试着把这部分之后的代码注销一下,然后运行程序看看效果.

应该还是会改变颜色,因此后面关于调色板的代码是没有意义的。
-----------------------------------------
我的意思是注销mg_lpBmpInf->bmiColors之后的语句,之后的才是调色板。mg_lpBmpInf->bmiColors不属于DC调色板的组成部分