您的位置:首页 > 其它

RGB颜色与BGR颜色的转换问题

2012-09-27 13:24 459 查看
http://blog.csdn.net/xiaorui0328/article/details/1748229

今天在解决一个bug的时候发现颜色始终对不上,调试……,发现问题,API得到的是BGR颜色,我要把他转换成RGB颜色。

先说名一下BGR颜色,像素的显示格式分为4种:

PAL_RGB,PAL_BGR,PAL_MASKED,PAL_INDEXED,

PAL_RGB:他的类型是unsignedlong,格式0x00BBGGRR,他和PALETTEENTRY结构是一样的。

PAL_BGR:他的类型是unsignedlong,格式0x00RRGGBB,他和RGBQUAD结构是一样的。

PAL_MASKED:主要是15和16bpp。也可以24,32.

PAL_INDEXED:1,2,4或者8bpp。

下面就来说一下怎么相互转换。一开始的时候想用按位运算的办法,本人比较懒,不想写那么多代码,后来发现一个简单的办法。^_^,从MSDN上看到的。代码如下:

unsignedlongdstValue=srcValue; ((unsignedchar*)(&dstValue))[0]=((unsignedchar*)(&srcValue))[2]; ((unsignedchar*)(&dstValue))[2]=((unsignedchar*)(&srcValue))[0];大家可看出来其实是把他们先转换成Char数组在进行互换的。很方便。我测试过没有问题。这个方法适用于RGB和BRG之间的相互转换。RGB转化成MASKED:unsignedlongdstValue= (((srcValue<<24)>>anDstShift[0])&aDstMask[0])| (((srcValue<<16)>>anDstShift[1])&aDstMask[1])| (((srcValue<<8)>>anDstShift[2])&aDstMask[2]);MASKED转换成RGB:unsignedlongulRed=(srcValue&aSrcMask[0])<<anSrcShift[0];
unsignedlongulGreen=(srcValue&aSrcMask[1])<<anSrcShift[1];
unsignedlongulBlue=(srcValue&aSrcMask[2])<<anSrcShift[2];

ulRed|=ulRed>>anSrcBits[0];
ulGreen|=ulGreen>>anSrcBits[1];
ulBlue|=ulBlue>>anSrcBits[2];

unsignedlongdstValue=
((ulRed>>24))|
((ulGreen>>16)&0x0000ff00)|
((ulBlue>>8)&0x00ff0000);其他的不常用就不写了。有不明白的看http://msdn2.microsoft.com/en-us/library/aa927915.aspx





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: