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:
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:
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:
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.