Pergunta

Eu sou um razoavelmente experiente programador Java, mas relativamente novo para Java2D.Eu estou tentando a escala de uma imagem, mas estou chegando resultados de baixa qualidade.A imagem é uma visualização de um painel contém coisas como texto e textfields.Eu sempre vou ser de escala para baixo, nunca para cima.

Atualmente eu estou usando o seguinte código:-

g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null);

Onde panelImage é a completa visualização de tamanho (BufferedImage) e scaledWidth e scaledHeight são as respectivas dimensões alvo.Eu pareço perder um monte de detalhes no texto e bordas de coisas, como textfields, etc.

Há uma melhor chamar que eu deveria estar usando a escala da imagem?

Obrigado, João

Foi útil?

Solução

Uma sugestão que posso fazer é, primeiro, redimensionar a imagem para um separado BufferedImage.A razão de ser, um Graphics2D objeto do BufferedImage pode ser obtido, a fim de produzir uma melhor qualidade de imagem em escala.

Graphics2D pode aceitar um processamento "dicas" que instruem a forma de processamento de imagem deve ser realizado pelo Graphics2D objecto.O setRenderingHint método é um dos métodos que pode ser utilizado para definir aqueles renderização dicas.A prestação dicas da RenderingHints classe pode ser usada.

Em seguida, usando o que Graphics2D objeto, uma imagem pode ser feita para o BufferedImage usando a renderização dicas especificados anteriormente.

Um áspero (não testado) código seria o seguinte:

BufferedImage scaledImage = new BufferedImage(
    scaledWidth,
    scaledHeight,
    BufferedImage.TYPE_INT_RGB
);

Graphics2D g = scaledImage.createGraphics();
g.setRenderingHints(
    RenderingHints.Key.KEY_INTERPOLATION,
    RenderingHints.VALUE_INTERPOLATION_BICUBIC
);

g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null);
g.dispose();

Outras dicas de renderização de interesse podem incluir:

O Controlar A Qualidade De Renderização seção do Java Tutoriais também tem mais informações sobre como controlar a qualidade de renderização de Graphics2D os objetos.

E para uma boa fonte de informações sobre como lidar com interfaces gráficas em geral, Podre De Rico Clientes por Chet Haase e Romain Guy é altamente recomendado.Não há uma seção do livro que lida com o problema de dimensionamento de imagens, o que parece bastante relevante.

Outras dicas

Pode ser que você deve ligar:

 g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

e

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

O Coobird está certo de que você precisa de escala reduzida de forma incremental (de preferência usando o Bicubic) para obter um resultado bonito para uma miniatura pequena o suficiente. Image.getScaledInstance costumava fazer isso com a abordagem Area_Average, mas é muito mais lenta que a escala incremental que foi original proposta por Chris Campbell em seus "perigos de imagem.getScaledInstance ()".

Por favor, desculpe a autopromoção aqui, mas eu rolei um punhado de "melhores práticas nativas de java" quando se trata de escalar imagens em uma biblioteca chamada imgscalr.

Está disponível sob uma licença e a fonte do Apache 2 está no GitHub; O objetivo da biblioteca era fazer a escala de imagem em Java Easy nativo (1 classe, 5 métodos estáticos) e garantir o resultado mais bonito (que é o que você queria originalmente), o resultado mais rápido (ótimo ao escalar entre imagens grandes ) ou um equilíbrio entre os dois e deixe a biblioteca decidir qual usar.

Eu só queria uma lib que pudesse "redimensionar minha imagem e sair do meu caminho" e depois de ler todas essas postagens por alguns dias quando eu abordei o ponto de dor (o meu também) estava voltando e compartilhando o trabalho para qualquer um caso contrário, pode ajudar.

Coobird tem a ideia correta. Eu também tentaria RenderingHints.VALUE_INTERPOLATION_BILINEAR interpolação e veja se é mais agradável. A bicúica funciona melhor quando se usa, no entanto. Para obter os melhores resultados ao reduzir a escala, um deveria escala reduzida em várias etapas. Primeiro, pela metade da resolução, depois pela metade novamente, etc. até você se aproximar da resolução desejada (ou seja, você não pode reduzir pela metade ou a imagem ficará muito pequena). O passo final é diminuir a resolução desejada.

Por exemplo, digamos que sua imagem de entrada seja 800x600 E você quer descer escala para 160x120:

  1. Downscale 50%. --> 400x300
  2. Downscale 50%. --> 200x150
  3. Escala reduzida para 160x120.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top