Изменение цвета непрозрачных частей png в Java - программирование
Подтвердить что ты не робот

Изменение цвета непрозрачных частей png в Java

Я пытаюсь автоматически изменить цвет для набора значков. Каждый значок имеет белый заполненный слой, а другая часть прозрачна. Вот пример: (в этом случае он зеленый, чтобы сделать его видимым)

icon search

Я попытался сделать следующее:

private static BufferedImage colorImage(BufferedImage image) {
        int width = image.getWidth();
        int height = image.getHeight();

        for (int xx = 0; xx < width; xx++) {
            for (int yy = 0; yy < height; yy++) {
                Color originalColor = new Color(image.getRGB(xx, yy));
                System.out.println(xx + "|" + yy + " color: " + originalColor.toString() + "alpha: "
                        + originalColor.getAlpha());
                if (originalColor.equals(Color.WHITE) && originalColor.getAlpha() == 255) {
                    image.setRGB(xx, yy, Color.BLUE.getRGB());
                }
            }
        }
        return image;
    }

Проблема заключается в том, что каждый пиксель, который я получаю, имеет одно и то же значение:

32|18 color: java.awt.Color[r=255,g=255,b=255]alpha: 255

Итак, мой результат - только цветной квадрат. Как я могу добиться изменения цвета непрозрачных частей? И почему все пиксели имеют одинаковое значение альфа? Я предполагаю, что моя основная проблема: что альфа-значение не читается правильно.

4b9b3361

Ответ 1

Проблема заключается в том, что

Color originalColor = new Color(image.getRGB(xx, yy));

отбрасывает все альфа-значения. Вместо этого вы должны использовать

 Color originalColor = new Color(image.getRGB(xx, yy), true);

чтобы сохранить доступные альфа-значения.

Ответ 2

Почему это не работает, я не знаю, это будет.

Это изменяет все пиксели на синий, сохраняя их значения альфа-сигналов...

enter image description here

import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class TestColorReplace {

    public static void main(String[] args) {
        try {
            BufferedImage img = colorImage(ImageIO.read(new File("NWvnS.png")));
            ImageIO.write(img, "png", new File("Test.png"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    private static BufferedImage colorImage(BufferedImage image) {
        int width = image.getWidth();
        int height = image.getHeight();
        WritableRaster raster = image.getRaster();

        for (int xx = 0; xx < width; xx++) {
            for (int yy = 0; yy < height; yy++) {
                int[] pixels = raster.getPixel(xx, yy, (int[]) null);
                pixels[0] = 0;
                pixels[1] = 0;
                pixels[2] = 255;
                raster.setPixel(xx, yy, pixels);
            }
        }
        return image;
    }
}