【问题标题】:Alpha channel ignored when using ImageIO.read()使用 ImageIO.read() 时忽略 Alpha 通道
【发布时间】:2019-03-27 01:26:43
【问题描述】:

我目前在使用 ImageIO.read(...) 读取 PNG 文件时遇到 alpha 通道问题

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(...) 返回一个BufferedImage 却没有提供指定图像类型的选项。那么我该怎么做呢? 非常感谢任何帮助。

提前致谢

【问题讨论】:

  • 我不是 100% 确定,但我认为你的“int unpacking”代码可能是错误的。我使用了(pixel >> 24) & 0xff(其中pixel 是特定像素的rgba 值)并且效果很好。我将此与java.awt.Color 的结果进行了比较,它们运行良好。我直接从java.awt.Color“窃取”了“提取”代码,这是另一个原因,我倾向于不以这种方式执行这些操作,这很容易搞砸

标签: java png bufferedimage alpha javax.imageio


【解决方案1】:

我认为,您的“int unpacking”代码可能是错误的。

我使用了(pixel >> 24) & 0xff(其中pixel 是特定像素的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:在有人说这是低效之前,我不是为了效率,我是为了快速写

您可能还想看看How to convert get.rgb(x,y) integer pixel to Color(r,g,b,a) in Java?,我也用它来验证我的结果

【讨论】:

  • 谢谢,这很有帮助。在玩了这个之后,我已经设法让它工作了。
【解决方案2】:

我认为问题在于您使用的是算术移位 (&gt;&gt;) 而不是逻辑移位 (&gt;&gt;&gt;)。因此0xff000000 &gt;&gt; 24 变为0xffffffff(即-1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2011-10-12
    • 2021-06-13
    • 2011-06-08
    • 2016-05-09
    相关资源
    最近更新 更多