为了账号安全,请及时绑定邮箱和手机立即绑定

使用 ImageIO.read() 时忽略 Alpha 通道

使用 ImageIO.read() 时忽略 Alpha 通道

守候你守候我 2021-12-01 19:17:30
我目前在读取 PNG 文件时遇到了 alpha 通道问题 ImageIO.read(...)fileInputStream = new FileInputStream(path);BufferedImage image = ImageIO.read(fileInputStream);//Just copying data into an integer arrayint[] pixels = new int[image.getWidth() * image.getHeight()];image.getRGB(0, 0, width, height, pixels, 0, width);但是,当尝试通过如下所示的位移位从像素阵列读取值时,alpha 通道总是返回 -1int 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(...)返回 aBufferedImage而不提供指定图像类型的选项。那么我该怎么做呢?任何帮助深表感谢。提前致谢
查看完整描述

2 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

我认为,您的“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);

    }

}

注意:在有人说这是低效之前,我不是为了效率,我是为了快速写作


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


查看完整回答
反对 回复 2021-12-01
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

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


查看完整回答
反对 回复 2021-12-01
  • 2 回答
  • 0 关注
  • 305 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信