cómo teñir una imagen PNG en blanco y negro a un color determinado en Java

Escipión:

Tengo una imagen .png que necesito para teñir un color personalizado con los valores RGB de 207, 173, 23. ( https://github.com/pret/pokecrystal/blob/master/gfx/tilesets/players_room.png? prima = true )

Hice un poco de investigación y encontré el siguiente código:

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;
}

Este método se supone que devuelve una imagen tamponada con los valores RGB introducidos. Sin embargo, cada vez que lo uso, sólo se vuelve más oscuro de un encendedor versión de la imagen sin color. Me pregunto si el problema radica en la propia imagen, tal vez tenga que ver con la transparencia o el problema es el código?

GKFX:

El problema es que la imagen PNG está configurado para contener sólo una escala de grises y por lo que el BufferedImage imgtambién sólo es capaz de sostener una escala de grises. Para solucionar este problema simplemente crear un BufferedImage salida en el modo de color RGB.

También puso en orden su manejo de excepciones.

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);
        }
    }
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=345331&siteId=1
Recomendado
Clasificación