按位操作 – 如何更改现有颜色?

我已经阅读了按位运算符(&| ^),我理解如果我这样做:

alpha = 0xFF000000 >> 24 ; blue = 0xFF0000FF & 0x000000FF; red = 0xFFFF0000>>16 & 0x000000FF; green = 0xFF00FF00>>8 & 0x000000FF; 

然后,我可以掩盖其他颜色,只有红色或蓝色(等…)组件,如果我这样做

 int color = alpha | blue | red | green; 

然后我再次重新构建颜色可以这么说。 我很好奇的是如果我想在Java中用两种颜色之间创建双线性插值。 我该怎么做呢? 我想从标准绿色(0xFF00FF00)开始,以黑色(0xFF000000)结束,中间的颜色将从绿色变为深绿色,直到最终变为黑色。 我认为我必须做一些事情,我创建一个bufferedImage,从顶部开始绿色,然后可能创建一个for循环,它将读取前一个像素的颜色,然后移动一些东西,直到以前的颜色的新版本是创建等等。 不幸的是,我不确定如何实现这一点,因为我理解按位运算和理论上的转变,但我不确定如何将它们用于此目的。 任何帮助将不胜感激! 先感谢您!

正如EJP所指出的那样 ,掩模用于过滤掉其中一个颜色分量/通道(红色,绿色,蓝色)的值。 而这通常是您使用位移/屏蔽操作所做的。 你所获得的所有其他值都是算术或更高级的数学。

颜色通道的范围是0-255,或hex值的0x00 – 0xFF。 要重建它,您需要将组件值移位回原位。 这可以与简单的算术加法一起放在一起:

 // Example values int r = 255; // 0xFF int g = 1; // 0x01 int b = 15; // 0x0F // go back to original form: // ARGB int color = r << 16; // 0x00.FF.00.00 color += g << 8; // 0x00.FF.01.00 color += b; // 0x00.FF.01.0F // just add back the alpha if it is going to be full on color = += 255 << 24; // 0xFF.FF.01.0F 

如果你想在颜色之间进行一些插值,你需要单独为每个颜色分量进行插值,而不是将它们全部放在一个整数中。 在某些情况下,将表示从[0-255]更改为十进制[0.0f-1.0f]也是一个好主意:

 // Darken red value by 50% int color = ...; // some color input int 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 two rDecimal = r/2; // rDecimal: 0.2 // Go back to original representation and put it back to r r = (int)(rDecimal * 255); // r: 51 = 0x33 // Put it all back in place color = (a << 24) + (r << 16) + (g << 8) + b; 

希望这会有所帮助。

我明白,如果我这样做:

不,你根本不懂。 在所有四种情况下,所有位移的结果都是0xff ,这显然是不正确的。 alpha掩码为0xff000000 ,蓝色掩码为0xff ,红色掩码为0xff0000 ,绿色掩码为0xff00 。 这些是掩码,需要使用&运算符应用于实际像素,以屏蔽相关通道。 在你可以继续前进之前,你需要了解它。