保存我的PNG会破坏Alpha通道

时间:2018-05-15 17:00:21

标签: java png alpha

我试图用alpha通道保存PNG图像,但在进行了一些按像素操作并保存之后,alpha通道在每个像素上都恢复到255。继承我的代码:

首先进行像素操作:

public BufferedImage apply(BufferedImage image) {
    int pixel;

    for (int y = 0; y < image.getHeight(); y++) {
        for (int x = 0; x < image.getWidth(); x++) {
            pixel = image.getRGB(x, y);

            if (threshold < getAverageRGBfromPixel(pixel)) {
                image.setRGB(x, y, new Color(0f, 0f, 0f, 0f).getRGB());
            }               
        }
    }


    return image;
}

注意:应该是透明的像素是黑色的,所以我绝对会击中它们。

并且说明了保存的代码。

@Test
public void testGrayscaleFilter() {
    ThresholdFilter thresholdFilter = new ThresholdFilter();

    testImage = thresholdFilter.apply(testImage);

    File outputFile = new File(TEST_DIR + "/testGrayPicture" + ".png");

    try {
        // retrieve image
        ImageIO.write(testImage, "png", outputFile);
    } catch (IOException e) {
}  

谁能告诉我我做错了什么?

2 个答案:

答案 0 :(得分:1)

通过查看BufferedImage类的文档,它不会写入alpha通道的唯一原因是原始BufferedImage对象的类型是TYPE_INT_RGB而不是TYPE_INT_ARGB。

一种解决方案是创建一个具有相同高度和宽度但类型为TYPE_INT_ARGB的新BufferedImage对象,当您更改像素数据时,使用else语句将其复制。

public BufferedImage apply(BufferedImage image) {
int pixel;
BufferedImage newImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);

for (int y = 0; y < image.getHeight(); y++) {
    for (int x = 0; x < image.getWidth(); x++) {
        pixel = image.getRGB(x, y);

        if (threshold < getAverageRGBfromPixel(pixel)) {
            newImage.setRGB(x, y, new Color(0f, 0f, 0f, 0f).getRGB());
        }
        else {
            // Not sure about this line
            newImage.setRGB(x, y, pixel);
        }
    }
}


return image;

}

答案 1 :(得分:-1)

当您将其保存为PNG24时,PNG不支持Alpha通道,仅支持Alpha透明度。