Como melhorar qualidade de imagem gerada?[Resolvido]

Bom dia galera,
Eu to com o seguinte problema.
Tenho uma classe aonde gero uma imagem de um mapa através do meu BD.
Só que essa imagem ta vindo com uma qualidade não muito boa e gostaria de melhorar isso.
Alguém sabe me dizer como fazer isso?

Utilizo para gerar essa imagem GTRenderer, Rectangle, ReferencedEnvelope, BufferedImage, Graphics2D, ImageIO e File.

Agradeço desde já.

Abraço.
Att.

A imagem no banco está em qual formato?
Qual formato você está usando para escrever a imagem?

No banco está armazenado um shape(.shp).
Eu carrego ele no meu código e salvo como arquivo de imagem, podendo ser jpeg, png, tiff, etc.

Então, JPG e GIF vão ter perda de qualidade por padrão. O JPG vc pode configurar a porcentagem da compactação.
Você tentou usar PNG? A imagem está ficando ruim mesmo assim?

Como faço para configurar a compactação do JPG?
GIF e PNG ficam a mesma coisa.

Olha a foto em formato GIF.

Queria melhorar a qualidade dela, porque depois vou trabalhar com questão de zoom na imagem e ai vou ter que utilizar a mesma questão para melhorar a imagem.

groff, eu trabalhei com GIS e usei um pouco de geotools e tal. Recomendo que você tente pensar em tiles, como o Google Maps faz. Dá uma olhada no OpenLayers, no MapServer e no Ka-Map. Porque para cada escala vai gerar uma renderização nova e suas imagens serão novamente exibidas. Elas podem ser pre-cacheadas no servidor.

1 curtida

Na hora de desenhar faça:

RenderingHints rh = g2.getRenderingHints (); rh.put (RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHints (rh);

Isso irá ativar anti-aliasing na sua imagem, o que vai suavizar bastante esse serrilhado. Na hora de ampliar, amplie a imagem e desenhe ampliada. Como sua informação é vetorial, não haverá perda de qualidade. O que vc não pode é ampliar o jpg ou gif gerado, pois aí ficará feio mesmo.

Ahhh a qualidade no seu caso é o serrilhado. Pensei que era outro tipo de imagem.
A dica do Viny vai resolver seu problema, pq suavizando o serrilhado no nível de zoom atual vai parecer que a imagem gerada é vetorial. Mas como o Viny falou, se ampliar a imagem (sem ser renderizando novamente) vai perder qualidade mesmo.

[]´s

Então Luiz, aqui aonde eu estou desenvolvendo essa aplicação não estão querendo usar OpenLayers.
Por isso to nessa questão de imagem.
Tiles eu ainda não tinha ouvido falar, mas vou dar uma pesquisada e mesmo se for OpenLayers, vou verificar se vale a pena.
Se o GoogleMaps faz assim, pode ser que eu consiga resultados melhores.

Então ViniGodoy, não estou ampliando a imagem dessa maneira não. Realmente fica muito ruim ampliar o jpg ou gif.
Uma dúvida sobre esse código que você me passou, esse g2 seria que tipo de objeto?

[quote]davidbuzatto 01/06/2010 10:08:38 Assunto: Re:Como melhorar qualidade de imagem gerada ?


Ahhh a qualidade no seu caso é o serrilhado. Pensei que era outro tipo de imagem.
A dica do Viny vai resolver seu problema, pq suavizando o serrilhado no nível de zoom atual vai parecer que a imagem gerada é vetorial. Mas como o Viny falou, se ampliar a imagem (sem ser renderizando novamente) vai perder qualidade mesmo.

[]´s
[/quote]

Vou tentar resolver dessa maneira davidbuzatto.

Obrigado pela ajuda.
Abraço

Oi groff.
O g2 é do tipo Graphics2D. É ele que vai fazer o desenho da imagem.
Antes de desenhar, obtenha o Graphics2D, sete os RederingHints e então mande pintar a imagem.
Você vai ver que ela vai ficar sem o serrilhado.

[]´s

Então, existem alguns componentes que “fatiam” as imagens. Tem um se eu não me engano chamado Zoomify mas acho que ele é pago… Mas tem umas soluções free sim. Porque no seu caso para cada ampliação ou redução da escala você deve gerar ou resgatar outras imagens e não redimensiona-las. Isso causaria um peso absurdo na sua aplicação. Fatiar a imagem é melhor pois são várias requisições pequenas ao invés de uma gigante. Você usa MapServer? porque lá tem umas soluções para tiles se eu não me engano.

[quote]davidbuzatto 01/06/2010 10:20:50 Assunto: Re:Como melhorar qualidade de imagem gerada ?


Oi groff.
O g2 é do tipo Graphics2D. É ele que vai fazer o desenho da imagem.
Antes de desenhar, obtenha o Graphics2D, sete os RederingHints e então mande pintar a imagem.
Você vai ver que ela vai ficar sem o serrilhado.

[]´s
[/quote]

Opa, vlw david.
Vou tentar aqui.
Abraço.

[quote]luiz.portnoy 01/06/2010 10:22:03 Assunto: Re:Como melhorar qualidade de imagem gerada ?


Então, existem alguns componentes que “fatiam” as imagens. Tem um se eu não me engano chamado Zoomify mas acho que ele é pago… Mas tem umas soluções free sim. Porque no seu caso para cada ampliação ou redução da escala você deve gerar ou resgatar outras imagens e não redimensiona-las. Isso causaria um peso absurdo na sua aplicação. Fatiar a imagem é melhor pois são várias requisições pequenas ao invés de uma gigante. Você usa MapServer? porque lá tem umas soluções para tiles se eu não me engano.
[/quote]

É dessa forma mesmo que eu tava imaginando, mas por enquanto to só querendo gerar a imagem melhor.
Porquê vai funcionar assim.
Eu vou ter essa imagem que eu mostrei logo acima, só que ai mais pra frente vai ter uma layer com a imagem da cidade desse mapa.
Eu vou setar o tamanho máximo da imagem e apartir daí, quando forem dar zoom ou arrastar o mapa(pan), vou gerar uma nova imagem e pintar na tela.
A questão de resgatar uma imagem eu já tinha pensado. Para mim acho que seria até mais fácil porque ai eu já deixaria as imagens criadas e trabalharia em cima delas.
O zoom seria pré-definido.
Por enquanto to querendo fazer esse meu método gerar essa imagem melhor, criar o método do zoom e do pan depois.
Não uso mapserver não. To utilizando Geotools + PostGis + PostGre + JTS.

RenderingHints rh = gr.getRenderingHints ();
rh.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
gr.setRenderingHints(rh);

Esse código me gerou uma imagem bem melhor. Gerando JPG ainda ficou um pouco de sujeira, mas a hora que gerei PNG, ficou ótima.
Vlw Galera.

Só diminui o tamanho da imagem, pq o tamanho que tava gerando antes era exagerado.
Mesmo naquele tamanho ficou muuito bom.

Dá uma lida aqui:
http://java.sun.com/docs/books/tutorial/2d/advanced/quality.html

Tem a descrição de bem mais opções de rendering hints.

Mas, basicamente, para máxima qualidade no desenho você usa:

RenderingHints rh = gr.getRenderingHints (); rh.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); rh.put(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); rh.put(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDERING_QUALITY); rh.put(RenderingHint.KEY_FRACTIONALMETRICS, RenderingHint.KEY_FRACTIONALMETRICS_ON); rh.put(RenderingHint.KEY_STROKE_CONTROL, RenderingHint.VALUE_STROKE_NORMALIZE); gr.setRenderingHints(rh);

Se tiver texto, ative também anti-aliasing para o texto:

rh.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

Ah sim, para melhorar a qualidade do JPG, basta reduzir a taxa de compactação. Esse site explica como fazer isso:
http://www.universalwebservices.net/web-programming-resources/java/adjust-jpeg-image-compression-quality-when-saving-images-in-java

Aproveite e veja também o material de Java 2D ali do Ponto V!
É sempre bom conhecer a API. :slight_smile:

[quote]ViniGodoy 01/06/2010 11:25:44 Assunto: Re:Como melhorar qualidade de imagem gerada ?


Dá uma lida aqui:
http://java.sun.com/docs/books/tutorial/2d/advanced/quality.html

Tem a descrição de bem mais opções de rendering hints.
[/quote]

Opa,
Vlw Vini.
Vai me ajudar muito isso.

Abraço.

Boa tarde,

Achei legal a melhora na qualidade da imagem, porém só gostaria de deixar registrado que fazer isso com Banco Espacial + GeoServer seria infinitamente mais fácil e rápido tendo em visto que no GeoServer já está tudo implementado, basta apenas chamar os web services.

Seria possivel fazer também utilizando a biblioteca Geotools, daria um pouco de trabalha, mas com certeza menos do que deu nas soluções apresentadas acima. Fica ai o registro.

Abraço,

Então fsquadro, imagino que seja mesmo bem mais fácil com o geoserver, mas infelizmente para o que eu estou fazendo não posso usar geoserver.
Mesmo assim eu agradeço a dica e qualquer coisa a mais que queira acrescentar ia ser legal, até mesmo como fazer isso com o geoserver ou com o geotools.

Abraço