Redimensionar ImageIcon com anti-alias [RESOLVIDO]

5 respostas
Lavieri

eu consigo redimensionar minha ImageIcon, mais fica muito borrado… alguem sabe como fazer pra colocar efeito tipo anti-alias ?? pra num ficar serrilhado ??

segue o código

public ImageIcon getLogoSmall() { ImageIcon nome = getLogo(); int scale = 140; return new ImageIcon( nome.getImage() .getScaledInstance( scale, ((nome.getIconHeight()*scale)/nome.getIconWidth()), Image.SCALE_DEFAULT ) ); }

Ps.: a imagem é PNG e tem transparencia

5 Respostas

ViniGodoy

Sua imagem não é vetorial, então isso que você quer não é possível. Talvez o JAI tenha algoritmos melhores, ou talvez aplicar alguns filtros na imagem possam atenuar o problema. Mas como você tem um bitmap em mãos, sempre haverá perda de informação.

Um ótimo site de filtros de imagem é esse aqui:
http://www.jhlabs.com/ip/filters/index.html

Ah, desligue-se do ImageIcon. Ele é uma classe que serve para exibir uma imagem na tela, não para manipula-la. A manipulação de imagens é feita através da classe BufferedImage. Aliás, o seu método getImage() retorna exatamente isso.

O ImageIcon você só cria no final, na hora de exibir a imagem na tela.

Lavieri

ViniGodoy:
Ah, desligue-se do ImageIcon. Ele é uma classe que serve para exibir uma imagem na tela, não para manipula-la. A manipulação de imagens é feita através da classe BufferedImage. Aliás, o seu método getImage() retorna exatamente isso.

O ImageIcon você só cria no final, na hora de exibir a imagem na tela.

é eu vi que é bem complicado manipular imagens em java… esse método esta assim, pq ele é invocado por um ComboBox … minha intenção não é exatamente manipular imagem… eu so tenho um quadro de onde o comprimento maximo deve ser 140, por isso fiz a mudança do tamanho…

to vendo que se eu quiser realmente mudar o tamanho da imagem corretamente vou ter que estudar bastante sobre imagens =/ …

ViniGodoy

Não é complicado. Aliás, é até bem simples.

Bom. Tente trocar o seu último parametro para Image.SCALE_SMOOTH. Como a documentação diz, ele tentará usar o melhor algoritmo de redimensionamento possível.

Lavieri

ViniGodoy:
Não é complicado. Aliás, é até bem simples.

Bom. Tente trocar o seu último parametro para Image.SCALE_SMOOTH. Como a documentação diz, ele tentará usar o melhor algoritmo de redimensionamento possível.

thanks! resolveu ^^

ViniGodoy

Talvez esse gere resultados ainda melhores:

public Image rescaleByWidth(Image img, int newWidth) {
    //Calcula a proporção para descobrir a nova altura
    double proportion = newWidth / (double)img.getWidth(null);
    int newHeight = (int)(img.getHeight(null) * proportion);

    //Cria a imagem de destino        
    BufferedImage newImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);        
    
    //Desenha sobre ela usando filtro Bilinear (o java não possui trinilear ou anisotrópica).
    Graphics2D g2d = newImage.createGraphics();        
    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g2d.drawImage(img, 0, 0, newWidth, newHeight, null);
    g2d.dispose();
        
    return new newImage;
}

//Uso
ImageIcon iconLogo = new ImageIcon(rescaleByWidth(getLogo().getImage(), 140));
Criado 27 de janeiro de 2009
Ultima resposta 27 de jan. de 2009
Respostas 5
Participantes 2