有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

这表明出了问题

如何正确地将它们组装回来


共 (2) 个答案

  1. # 1 楼答案

    Color类对这类操作非常有用,它有许多构造函数——其中一个接受颜色的字节码,然后r、g、b值可以很容易地从中获取,一旦你分离了这些值,你就可以使用另一个构造函数将其重新构建成颜色或字节码
    例如:

    import java.awt.Color;
    
    public class ColourTest {
    
        public static void main(String[] args) {
            Color   usingfloats = new Color(1f,0f,1f),
                    preset = Color.cyan,
                    usingbytecode = new Color(-16711681);
    
                int
                red = preset.getRed(),
                green = preset.getGreen(),
                blue = preset.getBlue();
    
                Color usingints = new Color(red, green, blue);
                System.out.println(usingints.getRGB());
            }
    }
    
  2. # 2 楼答案

    你做得对,只是印刷品放错地方了

    想象一下0x05 00的RGBA

    您成功地将R提取为5,并将其作为第一个值打印

    然后乘以0.21并存储为int(1)

    然后再换一次,红色变成0x01 00

    打印后一个值,而不是预期的1

    这就是为什么R值变化较大,而B值变化较小的原因。将它们分别除以256^n(位置),就可以得到期望的值