如何使用ImageIO.read()[Java]时忽略的Alpha通道?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (356)

我正在阅读PNG文件时遇到alpha通道问题 ImageIO.read(...)

fileInputStream = new FileInputStream(path);
BufferedImage image = ImageIO.read(fileInputStream);

//Just copying data into an integer array
int[] pixels = new int[image.getWidth() * image.getHeight()];
image.getRGB(0, 0, width, height, pixels, 0, width);

但是,当尝试通过位移从像素阵列读取值时,如下所示,alpha通道始终返回 -1

int a = (pixels[i] & 0xff000000) >> 24;
int r = (pixels[i] & 0xff0000) >> 16;
int g = (pixels[i] & 0xff00) >> 8;
int b = (pixels[i] & 0xff);
//a = -1, the other channels are fine

通过谷歌搜索问题我理解BufferedImage类型需要定义如下,以允许alpha通道工作:

BufferedImage image = new BufferedImage(width, height BufferedImage.TYPE_INT_ARGB);

但是ImageIO.read(...)返回a BufferedImage而不给出指定图像类型的选项。那我该怎么做呢?任何帮助深表感谢。

提问于
用户回答回答于

我认为,你的“int解包”代码可能是错误的。

我用过(pixel >> 24) & 0xffpixel特定像素的rgba值),工作正常。

我把它与结果进行了比较,结果java.awt.Color很好。

我直接“偷”了“提取”代码java.awt.Color,这是另一个原因,我倾向于不以这种方式执行这些操作,这很容易搞砸了

我真棒的测试代码......

BufferedImage image = ImageIO.read(new File("BYO image"));
int width = image.getWidth();
int height = image.getHeight();
for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        int pixel = image.getRGB(x, y);
        //value = 0xff000000 | rgba;
        int a = (pixel >> 24) & 0xff;
        Color color = new Color(pixel, true);
        System.out.println(x + "x" + y + " = " + color.getAlpha() + "; " + a);
    }
}

nb:在某人告诉我效率低下之前,我不打算提高效率,我很快就会写

您可能还想看看如何在Java中将get.rgb(x,y)整数像素转换为Color(r,g,b,a)?,我也用来验证我的结果

用户回答回答于

我认为问题在于你使用的是算术shift(>>)而不是逻辑shift(>>>)。因此0xff000000 >> 24成为0xffffffff(即-1

扫码关注云+社区

领取腾讯云代金券