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…