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:
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.
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
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
}