16

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

这是我尝试过的:

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

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

我究竟做错了什么?

提前致谢

4

2 回答 2

22

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

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 位中的蓝色分量组成。

于 2012-05-23T19:46:56.880 回答
5

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 值。此片段演示如何加载图像并在特定坐标(在本例中为 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 值。

于 2012-05-23T19:50:06.770 回答