Zoom com antialias

Galera,

Alguém sabe uma forma de implementar o zoom com antialias?? Eu implementei a função de zoom utilizando AffineTransform e desenhando a imagem (Graphics2D.drawImage) direto no JPanel, só que quando diminui o zoom ela perde muito a qualidade. Pesquisando por aí eu encontrei uma propriedade que você seta no Graphics antes de desenhar a imagem, só que no meu caso naum fez nenhuma diferença, segue abaixo o que eu fiz:

Graphics2D gg = (Graphics2D)g.create(); gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); gg.drawImage(bfImageOff, atx, this); gg.dispose();

se alguém puder dar uma força… obrigado…

Anti-aliasing é usado quando você quer escrever algum texto, ou desenhar alguma forma geométrica - em vez de usar apenas uma cor, são usadas várias cores para simular uma resolução melhor.
O seu caso é de interpolação, pois é o tipo de coisa que se usa com imagens (gerar pontos a partir de outros pontos preexistentes). Tente outro valor de RenderingHints:

http://java.sun.com/j2se/1.4.2/docs/api/java/awt/RenderingHints.html#VALUE_INTERPOLATION_BICUBIC

http://www.java-forums.org/awt-swing/8223-scale-2-more-pictures-using-jslider.html#post19890

Já parou para olhar o terceiro parâmetro do método getScaledInstance da própria classe Image?

Você pode ampliar uma imagem com qualidade máxima assim:

Image zoomed = original.getScaledInstance(1024,768, Image.SMOOTH);

Infelizmente, isso retorna um ToolkitImage. Para transforma-lo num BufferedImage seria necessário criar um novo BufferedImage com as novas dimensões e copiar a imagem lá. E é nesse caso que o AffineTransform se mostra vantajoso. Mas é sempre bom conhecer um método prático assim.

Não sei se você vai querer ou poder usar isto; mas bindings OpenGL costumam ser bastante práticos para essas tarefas. Os problemas são as desvantagens agregadas: código nativo, framework razoavelmente grande. Mas se você manipula imagens nesse nível, talvez se interesse em ao menos conhecer os recursos disponíveis. Procure por JOGL e LWJGL.

A API de manipulação de imagens em java é bastante competente, mas o fato é que a acelaração gráfica só é possível em ambientes windows, e ainda assim, com diversas exceções. Estas APIs que eu mencionei vão te dar um desempenho melhor e mais controle sobre os recursos gráficos, mas em contrapartida, trazem as desvantagens que eu mencionei.

[quote=ViniGodoy]Já parou para olhar o terceiro parâmetro do método getScaledInstance da própria classe Image?

Você pode ampliar uma imagem com qualidade máxima assim:

Image zoomed = original.getScaledInstance(1024,768, Image.SMOOTH);

Infelizmente, isso retorna um ToolkitImage. Para transforma-lo num BufferedImage seria necessário criar um novo BufferedImage com as novas dimensões e copiar a imagem lá. E é nesse caso que o AffineTransform se mostra vantajoso. Mas é sempre bom conhecer um método prático assim.[/quote]

Inicialmente eu estava implementando zoom com esse método mesmo (getScaledInstance), só que tive sérios problemas de memória com ele, cada vez que eu dava um zoom+ na imagem, a memória aumentava, chegando a mais de 150MB, por esse motivo tive que procurar outras técnicas de zoom com o JAI. Mas valeu pela resposta.

abraços…

[quote=javaBeats]Não sei se você vai querer ou poder usar isto; mas bindings OpenGL costumam ser bastante práticos para essas tarefas. Os problemas são as desvantagens agregadas: código nativo, framework razoavelmente grande. Mas se você manipula imagens nesse nível, talvez se interesse em ao menos conhecer os recursos disponíveis. Procure por JOGL e LWJGL.

A API de manipulação de imagens em java é bastante competente, mas o fato é que a acelaração gráfica só é possível em ambientes windows, e ainda assim, com diversas exceções. Estas APIs que eu mencionei vão te dar um desempenho melhor e mais controle sobre os recursos gráficos, mas em contrapartida, trazem as desvantagens que eu mencionei.[/quote]

valeu pela dica, vou dar uma olhada…

Abraços…