|
今天在解決一個(gè)bug的時(shí)候發(fā)現(xiàn)顏色始終對(duì)不上,調(diào)試……,發(fā)現(xiàn)問(wèn)題,API得到的是BGR顏色,我要把他轉(zhuǎn)換成RGB顏色。 先說(shuō)名一下BGR顏色,像素的顯示格式分為4種: PAL_RGB, PAL_BGR, PAL_MASKED, PAL_INDEXED, PAL_RGB: 他的類(lèi)型是unsigned long, 格式 0x00BBGGRR, 他和PALETTEENTRY結(jié)構(gòu)是一樣的。 PAL_BGR: 他的類(lèi)型是unsigned long, 格式 0x00RRGGBB, 他和RGBQUAD結(jié)構(gòu)是一樣的。 PAL_MASKED: 主要是15和16bpp。也可以 24,32. PAL_INDEXED: 1,2,4或者8 bpp。 下面就來(lái)說(shuō)一下怎么相互轉(zhuǎn)換。一開(kāi)始的時(shí)候想用按位運(yùn)算的辦法,本人比較懶,不想寫(xiě)那么多代碼,后來(lái)發(fā)現(xiàn)一個(gè)簡(jiǎn)單的辦法。^_^ ,從MSDN上看到的。代碼如下: unsigned long dstValue = srcValue; ((unsigned char *)(&dstValue))[0] = ((unsigned char *)(&srcValue))[2]; ((unsigned char *)(&dstValue))[2] = ((unsigned char *)(&srcValue))[0]; 大家可看出來(lái)其實(shí)是把他們先轉(zhuǎn)換成Char數(shù)組在進(jìn)行互換的。很方便。我測(cè)試過(guò)沒(méi)有問(wèn)題。這個(gè)方法適用于RGB和BRG之間的相互轉(zhuǎn)換。 RGB轉(zhuǎn)化成MASKED: unsigned long dstValue = ((( srcValue << 24 ) >> anDstShift[0] ) & aDstMask[0] ) | ((( srcValue << 16 ) >> anDstShift[1] ) & aDstMask[1] ) | ((( srcValue << 8 ) >> anDstShift[2] ) & aDstMask[2] );MASKED 轉(zhuǎn)換成RGB:unsigned long ulRed = (srcValue & aSrcMask[0]) << anSrcShift[0]; unsigned long ulGreen = (srcValue & aSrcMask[1]) << anSrcShift[1]; unsigned long ulBlue = (srcValue & aSrcMask[2]) << anSrcShift[2]; ulRed |= ulRed >> anSrcBits[0]; ulGreen |= ulGreen >> anSrcBits[1]; ulBlue |= ulBlue >> anSrcBits[2]; unsigned long dstValue = ((ulRed >> 24)) | ((ulGreen >> 16) & 0x0000ff00) | ((ulBlue >> 8) & 0x00ff0000);其他的不常用就不寫(xiě)了。有不明白的看http://msdn2.microsoft.com/en-us/library/aa927915.aspx看不懂英文的給我留言,我給他翻譯。估計(jì)沒(méi)有人會(huì)留言了。hoho |
|
|