bufferedImage.getRGB(x,y)不会产生alpha

Rap*_*pti 13 java rgb bufferedimage colors

我有一个BufferedImage i,我想从包含alpha值的某个像素中获取Color.使用和坐标识别像素.image xy

这是我试过的:

Color c = new Color(i.getRGB(x, y));
Run Code Online (Sandbox Code Playgroud)

出于某种原因,新的颜色对象包含正确的RGB,但alpha会丢失.

我究竟做错了什么?

提前致谢

mat*_*tts 19

Color您正在使用的单参数构造函数会丢弃Alpha信息.使用两个参数的版本而不是并传递truehasalpha:

Color c = new Color(i.getRGB(x, y), true);
Run Code Online (Sandbox Code Playgroud)

相关的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中的蓝色分量组成.


Bas*_*man 5

阿尔法不会丢失.

您必须使用(int,boolean)构造函数,该构造函数获取像素信息并指定它是否具有带布尔值的alpha值或带有4个值的构造函数,红色,绿色,蓝色和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值.此片段演示了如何加载图像并在某些坐标上获取该图像的颜色,在本例中为0,0.以下示例可以向您展示如何检索包括alpha在内的每个颜色值,并将其重建为新的Color.

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);

    }
   }
Run Code Online (Sandbox Code Playgroud)

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值.