什么是最有效的方法来做到这一点?
解决方法
真正的答案:取决于你正在寻找什么样的十六进制颜色值(例如565,555,888,8888等),alpha位的数量,实际的颜色分布(rgb vs bgr …)和一吨其他变量。
这里是一个通用的算法,大多数RGB值使用C模板(直接从ScummVM)。
template<class T> uint32 RGBToColor(uint8 r,uint8 g,uint8 b) { return T::kAlphaMask | (((r << T::kRedShift) >> (8 - T::kRedBits)) & T::kRedMask) | (((g << T::kGreenShift) >> (8 - T::kGreenBits)) & T::kGreenMask) | (((b << T::kBlueShift) >> (8 - T::kBlueBits)) & T::kBlueMask); }
这里是565(16位颜色的标准格式)的一个示例颜色结构:
template<> struct ColorMasks<565> { enum { highBits = 0xF7DEF7DE,lowBits = 0x08210821,qhighBits = 0xE79CE79C,qlowBits = 0x18631863,kBytesPerPixel = 2,kAlphaBits = 0,kRedBits = 5,kGreenBits = 6,kBlueBits = 5,kAlphaShift = kRedBits+kGreenBits+kBlueBits,kRedShift = kGreenBits+kBlueBits,kGreenShift = kBlueBits,kBlueShift = 0,kAlphaMask = ((1 << kAlphaBits) - 1) << kAlphaShift,kRedMask = ((1 << kRedBits) - 1) << kRedShift,kGreenMask = ((1 << kGreenBits) - 1) << kGreenShift,kBlueMask = ((1 << kBlueBits) - 1) << kBlueShift,kRedBlueMask = kRedMask | kBlueMask }; };