Como melhorar qualidade de imagem gerada?[Resolvido]  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
groff
Debugger
[Avatar]

Membro desde: 29/03/2009 02:56:24
Mensagens: 60
Offline

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.

This message was edited 1 time. Last update was at 01/06/2010 13:40:11

[Email] [MSN]
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline

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

Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
groff
Debugger
[Avatar]

Membro desde: 29/03/2009 02:56:24
Mensagens: 60
Offline

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.
[Email] [MSN]
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline

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?

Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
groff
Debugger
[Avatar]

Membro desde: 29/03/2009 02:56:24
Mensagens: 60
Offline

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.
[Email] [MSN]
luiz.portnoy
JavaChild
[Avatar]

Membro desde: 11/05/2010 13:56:09
Mensagens: 137
Localização: Vitória - ES
Offline

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.

Triste: Mike Portnoy saiu do Dream Theater...
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline

Na hora de desenhar faça:



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.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline

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

Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
groff
Debugger
[Avatar]

Membro desde: 29/03/2009 02:56:24
Mensagens: 60
Offline


luiz.portnoy 01/06/2010 09:56:43 Assunto: Re:Como melhorar qualidade de imagem gerada ?

--------------------------------------------------------------------------------

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.



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.


ViniGodoy 01/06/2010 09:58:41 Assunto: Re:Como melhorar qualidade de imagem gerada ?

--------------------------------------------------------------------------------

Na hora de desenhar faça:

view plaincopy to clipboardprint?
RenderingHints rh = g2.getRenderingHints ();
rh.put (RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHints (rh);
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.


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?

[Email] [MSN]
groff
Debugger
[Avatar]

Membro desde: 29/03/2009 02:56:24
Mensagens: 60
Offline

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


Vou tentar resolver dessa maneira davidbuzatto.

Obrigado pela ajuda.
Abraço
[Email] [MSN]
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline

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

Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
luiz.portnoy
JavaChild
[Avatar]

Membro desde: 11/05/2010 13:56:09
Mensagens: 137
Localização: Vitória - ES
Offline

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.

Triste: Mike Portnoy saiu do Dream Theater...
groff
Debugger
[Avatar]

Membro desde: 29/03/2009 02:56:24
Mensagens: 60
Offline

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


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

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.


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

This message was edited 1 time. Last update was at 01/06/2010 11:05:47

[Email] [MSN]
groff
Debugger
[Avatar]

Membro desde: 29/03/2009 02:56:24
Mensagens: 60
Offline



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.

This message was edited 2 times. Last update was at 01/06/2010 13:31:32

[Email] [MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline

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.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team