Zoom com antialias

5 respostas
danilogga

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…

5 Respostas

T

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

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.

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.

danilogga

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.

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…

danilogga

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.

valeu pela dica, vou dar uma olhada…

Abraços…

Criado 17 de março de 2009
Ultima resposta 18 de mar. de 2009
Respostas 5
Participantes 4