Estou tentando colorir uma imagem por código, mas as cores não funcionam direito

Oi! Essa é a minha primeira vez aqui. Eu sou iniciante, e queria saber oque eu estou fazendo de errado. Estou tentando trocar cores específicas de uma imagem, para poder dar opções de personalização para o usuário, mas não está funcionando muito bem.

public class Teste extends Entity {
public BufferedImage imagem;

public Teste(int x, int y, int width, int height, int speed, BufferedImage sprite) {
	super(x, y, width, height, speed, sprite);

	try {
		imagem = ImageIO.read(getClass().getResource("/Imagem.png"));
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

	
}

public void tick() {
	depth = 2;
	this.ColorImg(imagem, 0xFFFFFFFF, Color.yellow);
	
}

    public void ColorImg(BufferedImage img, int currentColorHex, Color color) {
	int[] pixels = new int[img.getWidth()*img.getHeight()];
	for(int xx = 0; xx < img.getWidth(); xx++) {
		for(int yy = 0; yy<img.getHeight(); yy++) {
			img.getRGB(0, 0, img.getWidth(), img.getHeight(), pixels, 0, img.getWidth());
			int pixelAtual = pixels[xx + (yy * img.getWidth())];
			if(pixelAtual == currentColorHex) {
				pixelAtual = color.getRGB();
				img.setRGB(xx, yy, pixelAtual);
				
			}
		}
	}	
}

public void render(Graphics g) {
	g.drawImage(imagem, this.getX(), this.getY(), null);
}

Por mais que eu consiga trocar a cor dos pixels específicos, eu só consigo fazer isso com preto, vermelho e branco. As outras cores ou não aparecem ou colorem os pixels de preto. Já tentei procurar outras formas de fazer mas não consegui.

Se alguém puder me ajudar ficarei bem agradecido.

Por favor, edite seu post para formatar o código. De preferência, se puder postar a classe inteira ou um exemplo mínimo em que o “problema” acontece, aí fica mais fácil de ajudar.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 *
 * @author David Buzatto
 */
public class Janela extends JFrame {
    
    private PainelImagem painel;
    
    public Janela() {
        
        super( "teste troca cor" );
        setDefaultCloseOperation( EXIT_ON_CLOSE );
        setSize( 600, 600 );
        setLocationRelativeTo( null );
        
        painel = new PainelImagem();
        add( painel, BorderLayout.CENTER );
        
        JButton btn = new JButton( "trocar..." );
        add( btn, BorderLayout.SOUTH );
        
        btn.addActionListener( new ActionListener(){
            @Override
            public void actionPerformed( ActionEvent e ) {
                
                Color c1 = JColorChooser.showDialog( null, "Cor original", Color.RED );
                Color c2 = JColorChooser.showDialog( null, "Nova cor", Color.BLACK );
                
                if ( c1 == null ) {
                    c1 = Color.RED;
                }
                
                if ( c2 == null ) {
                    c2 = Color.BLACK;
                }
                
                painel.mudaCor( c1, c2 );
                repaint();
                
            }
        });
        
    }
    
    private class PainelImagem extends JPanel {
        
        BufferedImage img;
    
        public PainelImagem() {
            try {
                img = ImageIO.read( new File( "img.bmp" ) );
            } catch ( IOException exc ) {
                exc.printStackTrace();
            }
        }

        @Override
        protected void paintComponent( Graphics g ) {
            super.paintComponent( g );
            g.drawImage( img, 0, 0, null );
        }
        
        void mudaCor( Color corOriginal, Color novaCor ) {
            for ( int y = 0; y < img.getHeight(); y++ )  {
                for ( int x = 0; x < img.getWidth(); x++ )  {
                    if ( img.getRGB( x, y ) == corOriginal.getRGB() ) {
                        img.setRGB( x, y, novaCor.getRGB() );
                    }
                }
            }
        }
    
    }
    
    public static void main( String args[] ) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Janela().setVisible( true );
            }
        } );
    }
    
}

img.bmp (214,4,KB)

1 curtida

Mto Obrigado, cara! Deu certo. Provavelmente o problema era não só o código, mas tbm o formato de imagem que eu estava usando (png), depois que eu troquei para bmp funcionou perfeitamente. Obrigado!

1 curtida