【问题标题】:Convert RGB values to Integer将 RGB 值转换为整数
【发布时间】:2011-01-26 04:15:03
【问题描述】:

所以在 BufferedImage 中,您会收到一个整数,其中表示 RGB 值。到目前为止,我使用以下方法从中获取 RGB 值:

// rgbs is an array of integers, every single integer represents the
// RGB values combined in some way
int r = (int) ((Math.pow(256,3) + rgbs[k]) / 65536);
int g = (int) (((Math.pow(256,3) + rgbs[k]) / 256 ) % 256 );
int b = (int) ((Math.pow(256,3) + rgbs[k]) % 256);

到目前为止,它有效。

我需要做的是弄清楚如何获得一个整数,这样我就可以使用BufferedImage.setRGB(),因为这需要它提供给我的相同类型的数据。

【问题讨论】:

    标签: java bufferedimage


    【解决方案1】:

    我认为代码类似于:

    int rgb = red;
    rgb = (rgb << 8) + green;
    rgb = (rgb << 8) + blue;
    

    另外,我相信您可以使用以下方法获取各个值:

    int red = (rgb >> 16) & 0xFF;
    int green = (rgb >> 8) & 0xFF;
    int blue = rgb & 0xFF;
    

    【讨论】:

    • 我认为你不需要 int 在后两行。第三行应该是“rgb = ...”吧?
    • 它是一个整数。一个整数包含 32 位。前 8 位用于 alpha 值(为零)。接下来的 8 个是红色,接下来是 8 个是绿色,接下来是 8 个是蓝色。尝试一下。如果最终输出等于您的初始输入,那么您就知道转换已正确完成。
    • 呃,我认为这取决于颜色深度。您的示例在我看来像 24 位颜色(每个通道 8 位) - 这是 BufferedImage 所期望的吗?
    • 是的,我假设缓冲图像的类型为 BufferedImage.TYPE_INT_RGB。也许这不是使用其他公式的原因。无论如何,这个概念是(据我所知)更容易移动位来获取单个值,而不是使用发布的代码。
    • 第一个代码示例中红色、绿色和蓝色的值是什么
    【解决方案2】:
    int rgb = ((r&0x0ff)<<16)|((g&0x0ff)<<8)|(b&0x0ff);
    

    如果您知道您的 r、g 和 b 值永远不会 > 255 或

    另外

    int red = (rgb>>16)&0x0ff;
    int green=(rgb>>8) &0x0ff;
    int blue= (rgb)    &0x0ff;
    

    不需要乘法。

    【讨论】:

      【解决方案3】:

      如果 r, g, b = 3 个整数值,从 0 到 255,每种颜色

      然后

      rgb = 65536 * r + 256 * g + b;
      

      单个 rgb 值是 r,g,b 的合成值,总共有 16777216 种可能的色调。

      【讨论】:

      • 为了便于阅读,我会将其修改为rgb = 0xFFFF * r + 0xFF * g + b;
      • 0xFF = 255。必须是 0x100。同样对于 0XFFFF
      • 感谢这个简单而优雅的公式......拯救了我的一天:D
      【解决方案4】:
      int rgb = new Color(r, g, b).getRGB();
      

      【讨论】:

        【解决方案5】:

        要获得单独的颜色值,您可以使用如下像素(x,y)的颜色。

        import java.awt.Color;
        import java.awt.image.BufferedImage;
        
        Color c = new Color(buffOriginalImage.getRGB(x,y));
        int red = c.getRed();
        int green = c.getGreen();
        int blue = c.getBlue();
        

        上面将为您提供红色、绿色和蓝色的整数值,范围为 0 到 255。

        要从 RGB 设置值,您可以这样做:

        Color myColour = new Color(red, green, blue);
        int rgb = myColour.getRGB();
        
        //Change the pixel at (x,y) ti rgb value
        image.setRGB(x, y, rgb);
        

        请注意,以上内容会更改单个像素的值。因此,如果您需要更改整个图像的值,您可能需要使用两个 for 循环来迭代图像。

        【讨论】:

          猜你喜欢
          • 2013-06-15
          • 2020-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-05
          • 2012-10-29
          • 2011-01-24
          • 2013-05-10
          相关资源
          最近更新 更多