使用 ImageIO.read() 时忽略 Alpha 通道
Alpha channel ignored when using ImageIO.read()
我目前在使用 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(...)
returns一个BufferedImage
没有给出指定图片类型的选项。那我该怎么做呢?
非常感谢任何帮助。
提前致谢
我认为,您的 "int unpacking" 代码可能有误。
我使用了 (pixel >> 24) & 0xff
(其中 pixel
是特定像素的 rgba 值)并且效果很好。
我将其与 java.awt.Color
的结果进行了比较,它们运行良好。
我 "stole" "extraction" 代码直接来自 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?,我也用它来验证我的结果
我认为问题在于您使用的是算术移位 (>>
) 而不是逻辑移位 (>>>
)。因此 0xff000000 >> 24
变成 0xffffffff
(即 -1
)
我目前在使用 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(...)
returns一个BufferedImage
没有给出指定图片类型的选项。那我该怎么做呢?
非常感谢任何帮助。
提前致谢
我认为,您的 "int unpacking" 代码可能有误。
我使用了 (pixel >> 24) & 0xff
(其中 pixel
是特定像素的 rgba 值)并且效果很好。
我将其与 java.awt.Color
的结果进行了比较,它们运行良好。
我 "stole" "extraction" 代码直接来自 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?,我也用它来验证我的结果
我认为问题在于您使用的是算术移位 (>>
) 而不是逻辑移位 (>>>
)。因此 0xff000000 >> 24
变成 0xffffffff
(即 -1
)