【问题标题】:bufferedImage.getRGB(x, y) does not yield alphabufferedImage.getRGB(x, y) 不产生 alpha
【发布时间】:2012-05-30 09:27:17
【问题描述】:

我有一个 BufferedImage i,我想从该 image 的某个像素中获取 Color包括 alpha 值。使用xy 坐标标识像素。

这是我尝试过的:

Color c = new Color(i.getRGB(x, y));

由于某种原因,新颜色对象包含正确的 RGB,但 alpha 丢失了。

我做错了什么?

提前致谢

【问题讨论】:

  • 我不太确定这个类是如何工作的,但是您使用了一个名为 getRGB 的函数,然后您会惊讶于它只获得 RGB?
  • 是的,这是真的,但我之前使用 getRGB() 方法检查了像素是否包含任何 alpha 值。 stackoverflow.com/questions/10419838/…
  • 我明白了。你所说的“阿尔法迷路了”到底是什么意思?
  • 新颜色不透明。

标签: java colors rgb bufferedimage


【解决方案1】:

您正在使用的单参数 Color 构造函数会丢弃 alpha 信息。改用双参数版本,并传入truehasalpha

Color c = new Color(i.getRGB(x, y), true);

相关Javadoc

Color(int rgb)

使用指定的组合 RGB 值创建不透明的 sRGB 颜色,该值由 16-23 位中的红色分量、8-15 位中的绿色分量和 0-7 位中的蓝色分量组成。

Color(int rgba, boolean hasalpha)

创建具有指定组合 RGBA 值的 sRGB 颜色,该值由位 24-31 中的 alpha 分量、位 16-23 中的红色分量、位 8-15 中的绿色分量和位 0- 中的蓝色分量组成7.

【讨论】:

    【解决方案2】:

    Alpha 没有丢失。

    您必须使用 (int,boolean) 构造函数来获取像素信息并使用布尔值指定它是否具有 alpha 值,或者使用具有 4 个值 Red、Green、Blue 和 Alpha 的构造函数。

    来自JavaDoc的(int,int,int,int)构造函数信息

    为了缩短代码,您可以随时将以下所有代码替换为 Color color = new Color(i.getRGB(x, y), true); 它告诉颜色构造器像素信息确实包含 Alpha 值。

    JavaDoc 中的 (int,boolean) 构造函数信息

    请注意,有时在检索 alpha 时,以下方式可能会返回 -1,在这种情况下,这意味着它会循环回 255,因此您必须执行 256-1 才能获得实际的 alpha 值。这个 sn-p 演示了如何加载图像并在特定坐标上获取该图像的颜色,在本例中为 0,0。以下示例可以向您展示如何检索包括 alpha 在内的每个颜色值,并将其重建为新颜色。

    import java.awt.Color;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    import javax.imageio.ImageIO;
    
    public class main {
    
        public static void main(String [] args){
            BufferedImage image = null;
            try {
                image = ImageIO.read(new URL("image.png"));
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            int pixel = image.getRGB(0, 0);
    
            int alpha = (pixel >> 24) & 0xff;
            int red = (pixel >> 16) & 0xff;
            int green = (pixel >> 8) & 0xff;
            int blue = (pixel >> 0) & 0xff;
    
            Color color1 = new Color(red, green, blue, alpha);
    
            //Or use
            Color color2 = new Color(image .getRGB(0, 0), true);
    
        }
       }
    

    BufferedImages getRGB(int,int) JavaDoc 如你所见:

    Returns an integer pixel in the default RGB color model (TYPE_INT_ARGB) and default sRGB colorspace. Color conversion takes place if this default model does not match the image ColorModel. There are only 8-bits of precision for each color component in the returned data when using this method.

    这意味着 Alpha 值也被检索。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      相关资源
      最近更新 更多