Сохранение моего PNG разрушает альфа-канал - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь сохранить изображение PNG с альфа-каналом, но после некоторой пиксельной манипуляции и сохранения его, альфа-канал вернулся к 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 голосов
/ 15 мая 2018

PNG не поддерживает альфа-каналы, только альфа-прозрачность при сохранении в формате PNG24.

0 голосов
/ 15 мая 2018

При просмотре документации класса BufferedImage единственная причина, по которой он не будет записывать в альфа-канал, заключается в том, что исходный объект BufferedImage имеет тип TYPE_INT_RGB, а не TYPE_INT_ARGB.

Одним из решений было бы создание нового объекта BufferedImage с той же высотой и шириной, но с типом TYPE_INT_ARGB, и при изменении данных пикселей скопируйте его с помощью оператора 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;

}

...