java如何正确执行逐位操作
每个像素的结构如下:
...........PIXEL............
[red | green | blue | alpha]
<-8--><--8---><--8--><--8-->
我需要做以下事情:
1.提取RGBA值
2.对RGB值和notA值进行一些计算
3.将它们重新组合在一起,形成具有新值的像素
我是这样做的:
for(int i = 0;i < img.pixels.length;i++){
int pixel = img.pixels[i];
int red = (pixel & 0xFF000000) >>> 24;
int green = (pixel & 0x00FF0000) >>> 16;
int blue = (pixel & 0x0000FF00) >>> 8;
int alpha = (pixel & 0x000000FF);
println("Red: " + red + " Green: " + green + " Blue: " + blue + " Alpha: " + alpha);
/*
* Luminosity Method.
*/
red = (int) (red * 0.21);
green = (int) (green * 0.71);
blue = (int) (blue * 0.07);
/*
* Assemble them back again
*/
red = red << 24;
green = green << 16;
blue = blue << 8;
println("AvgRed : " + red + " AvgGreen: " + green + " AvgBlue: " + blue);
pixel= red | green | blue | alpha;
img.pixels[i] = pixel;
}
updatePixels();
但我再次转移它们的位置来组装它们,似乎有点不对劲
控制台中的值如下所示:
Red: 255 Green: 83 Blue: 100 Alpha: 82 // actual values
AvgRed : 889192448 AvgGreen: 3801088 AvgBlue: 1792 // new values after calculation and shifting
这表明出了问题
如何正确地将它们组装回来
# 1 楼答案
Color类对这类操作非常有用,它有许多构造函数——其中一个接受颜色的字节码,然后r、g、b值可以很容易地从中获取,一旦你分离了这些值,你就可以使用另一个构造函数将其重新构建成颜色或字节码
例如:
# 2 楼答案
你做得对,只是印刷品放错地方了
想象一下0x05 00的RGBA
您成功地将
R
提取为5,并将其作为第一个值打印然后乘以0.21并存储为int(1)
然后再换一次,红色变成0x01 00
打印后一个值,而不是预期的1
这就是为什么R值变化较大,而B值变化较小的原因。将它们分别除以256^n(位置),就可以得到期望的值