java - 这个java位移位有什么作用?

标签 java bit-shift

我在 Java implementation of Hough Transform 中发现了一些位移代码关于Rosetta代码,我大致了解代码的作用,除了这部分:

rgbValue = (int)(((rgbValue & 0xFF0000) >>> 16) * 0.30 + ((rgbValue & 0xFF00) >>> 8) * 0.59 + (rgbValue & 0xFF) * 0.11);

我认为它需要所有 3 个像素的平均值,这至少是我输出结果时的样子。但这是如何运作的呢?这些神奇的数字是什么?

该函数的使用方法,方便粘贴:

public static ArrayData getArrayDataFromImage(String filename) throws  IOException
{
    BufferedImage inputImage = ImageIO.read(new File(filename));
    int width = inputImage.getWidth();
    int height = inputImage.getHeight();
    int[] rgbData = inputImage.getRGB(0, 0, width, height, null, 0, width);
    ArrayData arrayData = new ArrayData(width, height);
    // Flip y axis when reading image
    for (int y = 0; y < height; y++)
    {
      for (int x = 0; x < width; x++)
      {
        int rgbValue = rgbData[y * width + x];

       // What does this do?
        rgbValue = (int)(((rgbValue & 0xFF0000) >>> 16) * 0.30 + ((rgbValue & 0xFF00) >>> 8) * 0.59 + (rgbValue & 0xFF) * 0.11);
        arrayData.set(x, height - 1 - y, rgbValue);
      }
    }
    return arrayData;
}

最佳答案

这是使用系数 0.30.590.11 将 24 位 RGB 值转换为灰度值的技巧(注意这些值加起来为 1)。

此操作 (rgbValue & 0xFF0000) >>> 16 剪切位 17..24,并将它们右移到位置 0..7,产生 0 到 255 之间的值(包括 0 和 255)。类似地,(rgbValue & 0xFF00) >>> 8 剪切位 8..16,并将它们移动到位置 0..7。

This Q&A讨论系数,并讨论其他替代方案。

关于java - 这个java位移位有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40541199/

相关文章:

java - Spring-data-aerospike 与 aql 创建的索引不兼容

java - 返回二维数组中的行数?

java - Java中如何将一个int转换为三个字节?

c++ - 什么时候右移操作>>移位符号位,什么时候不移位?

java - 使用 Collections.sort 和 SizeFileComparator 对 ArrayLlist<File> 中的 File 对象进行排序

java - 如何在 Android eclipse 中导入外部 JAR 文件

java - JAX-WS Web 服务线程安全和性能问题

java - 基于 3 个不同的整数创建一个唯一的整数

c - 如何在 C 中将 Hex 数组放入 int 数组中?

C++左移操作