Ios 32位RGBA到16位BGR565转换

Ios 32位RGBA到16位BGR565转换,ios,objective-c,c,colors,Ios,Objective C,C,Colors,有人能帮我把32位RGBA颜色转换成16位BGR565吗。到目前为止,我所做的是: //INPUT VALUES 32BIT RGBA Color int alpha = 0.0 to 1.0 value here; int red = 0.0 to 255.0 value here; int green = 0.0 to 255.0 value here; int blue = 0.0 to 255.0 value here; //CONVERTING TO BGR565 int red0

有人能帮我把32位RGBA颜色转换成16位BGR565吗。到目前为止,我所做的是:

//INPUT VALUES 32BIT RGBA Color
int alpha =  0.0 to 1.0 value here;
int red = 0.0 to 255.0 value here;
int green = 0.0 to 255.0 value here;
int blue = 0.0 to 255.0 value here;

//CONVERTING TO BGR565
int red0 = (red * 31) / 255;
int green0 = (green * 63) / 255;
int blue0 = (blue * 31) / 255;
uint16_t BGRColor = red0;
BGRColor |= (green0 << 5);
BGRColor |= (blue0 << 11);
//输入值32位RGBA颜色
int alpha=此处的0.0到1.0值;
int red=0.0到255.0的值;
int绿色=0.0到255.0的值;
蓝色整数=0.0到255.0的值;
//转换为BGR565
int red0=(红色*31)/255;
int green0=(绿色*63)/255;
int blue0=(蓝色*31)/255;
uint16_t BGRColor=red0;

BGRColor |=(green0您的转换代码可以更精确。表达式

(red * 31) / 255;
将值映射如下(8位到5位):

这显然是不一致的。如果你简单地将输入值除以8(右移除以3)

您将得到以下结果:

0-7 => 0 (8 values)
8-15 => 1 (8 values)
16-23 => 2 (8 values)
24-31 => 3 (8 values)
32-39 => 4 (8 values)
40-47 => 5 (8 values)
48-55 => 6 (8 values)
56-63 => 7 (8 values)
64-71 => 8 (8 values)
72-79 => 9 (8 values)
80-87 => 10 (8 values)
88-95 => 11 (8 values)
96-103 => 12 (8 values)
104-111 => 13 (8 values)
112-119 => 14 (8 values)
120-127 => 15 (8 values)
128-135 => 16 (8 values)
136-143 => 17 (8 values)
144-151 => 18 (8 values)
152-159 => 19 (8 values)
160-167 => 20 (8 values)
168-175 => 21 (8 values)
176-183 => 22 (8 values)
184-191 => 23 (8 values)
192-199 => 24 (8 values)
200-207 => 25 (8 values)
208-215 => 26 (8 values)
216-223 => 27 (8 values)
224-231 => 28 (8 values)
232-239 => 29 (8 values)
240-247 => 30 (8 values)
248-255 => 31 (8 values)
因此,我推荐以下代码:

int red0 = red / 8;
int green0 = green / 4;
int blue0 = blue / 8;
这也是更有效的,因为任何像样的编译器都可以

您还可以屏蔽相关位并将其直接移动到目标位置:

uint16_t BGRColor = red >> 3;
BGRColor |= (green & 0xFC) << 3;
BGRColor |= (blue  & 0xF8) << 8;
uint16\u t BGRColor=red>>3;

BGRColor |=(绿色和0xFC)使用<代码> uint 160tRe0而不是<代码> int Re0,并且对其他两个代码进行排序。上面的代码是OK。我有一个错误,从CGIMAGE中正确读取输入值。很好,考虑删除这个问题。我认为如果有人正在寻找转换代码,可以把它留下来,但我不确定是否有。使用stackoverflow rulesExcellent可以。这肯定比我的代码更精确。现在转换后颜色看起来更好。非常感谢。
int red0 = red / 8;
int green0 = green / 4;
int blue0 = blue / 8;
uint16_t BGRColor = red >> 3;
BGRColor |= (green & 0xFC) << 3;
BGRColor |= (blue  & 0xF8) << 8;