как тонировать черно-белое изображение в формате PNG до определенного цвета в Java - PullRequest
1 голос
/ 22 марта 2020

У меня есть изображение в формате .png, которое мне нужно, чтобы подкрасить пользовательский цвет со значениями RGB 207, 173, 23. (https://github.com/pret/pokecrystal/blob/master/gfx/tilesets/players_room.png?raw=true)

Я провел некоторые исследования и нашел следующий код:

public BufferedImage getBufferedImage(String source, int redPercent, int greenPercent, int bluePercent) throws IOException{
    BufferedImage img = null;
    File f = null;

    try{
        f = new File(source);
        img = ImageIO.read(f);
    }catch(IOException e){
        System.out.println(e);
    }

    int width = img.getWidth();
    int height = img.getHeight();

    for(int y = 0; y < height; y++){
        for(int x = 0; x < width; x++){
            int p = img.getRGB(x,y);

            int a = (p>>24)&0xff;
            int r = (p>>16)&0xff;
            int g = (p>>8)&0xff;
            int b = p&0xff;

            p = (a<<24) | (redPercent*r/100<<16) | (greenPercent*g/100<<8) | (bluePercent*b/100);

            img.setRGB(x, y, p);
        }
    }

    return img;
}

Этот метод должен возвращать буферизованное изображение с введенными значениями RGB. Однако всякий раз, когда я его использую, он возвращает только более светлую и темную версию изображения без цвета. Мне интересно, заключается ли проблема в самом изображении, возможно, в прозрачности или проблема в коде?

1 Ответ

1 голос
/ 22 марта 2020

Проблема в том, что изображение PNG настроено для хранения только данных в оттенках серого, и поэтому BufferedImage img также может содержать только данные в оттенках серого. Чтобы это исправить, просто создайте выход BufferedImage в цветном режиме RGB.

Я также привел в порядок вашу обработку исключений.

import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;


class SOQuestion {
    public static BufferedImage getBufferedImage(String source,
            int redPercent, int greenPercent, int bluePercent) {
        BufferedImage img = null;
        File f = null;

        try {
            f = new File(source);
            img = ImageIO.read(f);
        } catch (IOException e) {
            System.out.println(e);
            return null;
        }

        int width = img.getWidth();
        int height = img.getHeight();
        BufferedImage out = new BufferedImage(width, height,
            BufferedImage.TYPE_INT_RGB);

        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                int p = img.getRGB(x,y);

                int a = (p>>24) & 0xff;
                int r = (p>>16) & 0xff;
                int g = (p>>8) & 0xff;
                int b = p & 0xff;

                p = (a<<24) | (redPercent*r/100<<16) |
                    (greenPercent*g/100<<8) | (bluePercent*b/100);

                out.setRGB(x, y, p);
            }
        }

        return out;
    }

    public static void main(String[] args) {
        BufferedImage result = SOQuestion.getBufferedImage(args[0], 81, 68, 9);
        File outputfile = new File("output.png");
        try {
            ImageIO.write(result, "png", outputfile);
        } catch (IOException e) {
            System.out.println(e);
        }
    }
}
...