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
)
);
}
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.
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:
publicImagerescaleByWidth(Imageimg,intnewWidth){//Calcula a proporção para descobrir a nova alturadoubleproportion=newWidth/(double)img.getWidth(null);intnewHeight=(int)(img.getHeight(null)*proportion);//Cria a imagem de destino BufferedImagenewImage=newBufferedImage(newWidth,newHeight,BufferedImage.TYPE_INT_ARGB);//Desenha sobre ela usando filtro Bilinear (o java não possui trinilear ou anisotrópica).Graphics2Dg2d=newImage.createGraphics();g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);g2d.drawImage(img,0,0,newWidth,newHeight,null);g2d.dispose();returnnewnewImage;}//UsoImageIconiconLogo=newImageIcon(rescaleByWidth(getLogo().getImage(),140));