正如EJP所指出的,这些遮罩用于过滤出颜色分量/通道之一(红色,绿色,蓝色)的值。这通常是您进行移位/屏蔽 *** 作的方式。使用获得的值所做的所有其他 *** 作都是算术或更高级的数学。
彩色通道的范围是0-255,或十六进制值是0x00-0xFF。要重建它,您需要将组件值移回原位。可以与简单的算术加法放在一起:
// Example valuesint r = 255; // 0xFFint g = 1; // 0x01int b = 15; // 0x0F// go back to original form:// A R G Bint color = r << 16; // 0x00.FF.00.00color += g << 8; // 0x00.FF.01.00color += b;// 0x00.FF.01.0F// just add back the alpha if it is going to be full oncolor = += 255 << 24; // 0xFF.FF.01.0F
如果要在颜色之间进行一些插值,则需要对每个颜色分量分别进行插值,而不是将所有颜色组合在一起。在某些情况下,将表示形式从[0-255]更改为小数点后的[0.0f-1.0f]也可能是个好主意:
// Darken red value by 50%int color = ...; // some color inputint mask = 0xFF;int a = (color >> 24) & mask;int r = (color >> 16) & mask;int g = (color >> 8) & mask;int b = color & mask;// convert to decimal form:float rDecimal = r / 255f; // Let r: 0x66 = 102 => rDecimal: 0.4// darken with 50%, basically divide it by tworDecimal = r/2; // rDecimal: 0.2// Go back to original representation and put it back to rr = (int)(rDecimal * 255); // r: 51 = 0x33// Put it all back in placecolor = (a << 24) + (r << 16) + (g << 8) + b;
希望这会有所帮助。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)