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

时间:2018-10-22 22:01:45

标签: java png bufferedimage alpha javax.imageio

使用export function getResult(values = {searchText: "", categoryList: ""}) { const search = values.searchText; const category = values.categoryList; 读取PNG文件时,我当前遇到Alpha通道问题

ImageIO.read(...)

但是,当尝试通过移位从像素阵列中读取值时,如下所示,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);

-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 类型需要定义如下,以允许alpha通道正常工作:

BufferedImage

但是BufferedImage image = new BufferedImage(width, height BufferedImage.TYPE_INT_ARGB); 会返回ImageIO.read(...),而没有提供指定图像类型的选项。那我该怎么做呢? 非常感谢您的帮助。

预先感谢

2 个答案:

答案 0 :(得分: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?,我也用它来验证我的结果

答案 1 :(得分:1)

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