[RESOLVIDO] Tirar fundo verde de uma imagem

Opa, e aí gente? Venho aqui pois tenho uma dúvida:
Será que existe uma classe que tire o fundo verde(ou qualquer outra cor) de uma imagem? E se não tiver, como criar uma classe como essa?
Desde já, obrigado!
Exemplo de imagem para tirar o fundo:

1.bmp (72,1 KB)

1 curtida

Você pode carregar a imagem em um BufferedImage, e percorrer os pixels da imagem, fazendo a substituição dos pixels de uma cor por qualquer outra cor, ou mesmo deixando esses pixels transparentes (mudando o canal alpha da cor). Como a cor a ser substituída é consistente (sempre a mesma), a comparação não deve ser difícil.

Abraço.

4 curtidas

Bacana isso.

1 curtida

Opa, me desculpa pelo tópico reaberto, mas eu tentei fazer o que você falou, e não deu certo.
SOURCE:

public class SpriteTransparent { //Classe que pede uma imagem e a transforma em transparente

    private BufferedImage ss;

    public SpriteTransparent(BufferedImage img) {
        this.ss = img; //RECEBE UMA IMAGEM E TIRA O FUNDO ROSA.
        for (int x = 0; x < ss.getWidth(); x++) {
            for (int y = 0; y < ss.getHeight(); y++) {
                //ENTRA EM DOIS FOR PARA TESTAR TODOS OS PIXELS DA IMAGEM
                if (ss.getRGB(x, y) == new Color(255, 0, 255, 255).getRGB()){ //SE FOR ROSA
                    ss.setRGB(x, y, new Color(0, 0, 0, 0).getRGB()); //TRANSFORMA EM TRANSPARENTE
                }
            }
        }
    }

    public BufferedImage getSpriteTransparent(){ //RETORNA A IMAGEM.
    return ss;
    }
}

Então, ele realmente pegou todos os pixels rosas e o modificaram. O problema é que não está ficando transparente, e sim preto. Mesmo setando o alpha pra ser transparente, ele não fica. Eu chequei o tipo de BufferedImage dele e mostra BufferedImage.TYPE_3BYTE_BGR. Eu li muito na internet e vi que, para ele ficar transparente, precisa ser BufferedImage.TYPE_INT_ARGB, mas não consigo mudar o tipo. Pode me ajudar?

EDIT:
Eu estou recebendo a imagem com ImageIO.read(), e passando pra essa classe como parâmetro.

Kirinn, beleza? Cara, vc chegou a tentar colocar essa imagem “dentro” de outra? Ás vezes fica preto, mas o fundo tá transparente mesmo.

Então mano, eu nem precisei fazer isso pra descobrir, pq mesmo com o valor alpha 0, eu consigo mudar o fundo preto pra qualquer cor só editando as variáveis r g e b nos parâmetros. É como se o método ignorasse o valor alpha e considerasse como opaco

Cara, eu fiz um teste com um componente aqui, ele até deu transparencia, mas se eu passo o mouse por cima a cor vai voltando.

jButton1.setBackground(new Color(242, 38, 19, 150));

Vc ta salvando o novo arquivo ou ta visualizando direto no jframe?

Desconfio que não dá pra alterar o tipo do BufferedImage após carregá-lo (com ImageIO.read). De qualquer forma, você pode criar um novo BufferdImage com o mesmo tamanho do original mas do tipo certo, e copiar os pixels de um pra outro, exceto os que devem ser transparentes. Algo assim:

public BufferedImage tornarTransparente(BufferedImage image){
		int corDoCanto = image.getRGB(0,0); // pega a cor de referencia para a transparencia
		Color transparente = new Color(255,255,255,0); // cor transparente, para ser passada pra nova imagem
		
		// nova imagem com o tipo certo
		BufferedImage resultado = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
		
		// percorre todos os pixels
		for (int i = 0; i < image.getWidth(); i++){
			for (int j = 0; j < image.getHeight(); j++){
				int corDoPixel = image.getRGB(i,j); // pega a cor do pixel 
				if (corDoCanto == corDoPixel){ // compara com a cor de referencia do canto 0,0
					resultado.setRGB(i, j, transparente.getRGB()); // torna o pixel transparente
				}else{
					resultado.setRGB(i, j, image.getRGB(i,j)); // mantém a cor original
				}
			}
		}
		
		return resultado; // retorna a nova imagem
	}

Abraço.

3 curtidas

Opa assim funcionou! Muito obrigado cara! Te devo muitas!