【发布时间】: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