Question

Je suis un programmeur Java raisonnablement expérimenté mais relativement nouveau pour Java2D. Je suis en train de redimensionner l'image mais je suis d'obtenir des résultats de qualité médiocre. L'image est un aperçu d'un panneau contient donc des choses comme du texte et des champs de texte. Je serai toujours mise à l'échelle vers le bas, jamais.

Actuellement, je suis en utilisant le code suivant: -

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

Où panelImage est l'aperçu pleine taille (BufferedImage) et scaledWidth et scaledHeight sont les dimensions cibles respectives. Il me semble perdre beaucoup de détails dans le texte et les bords des choses comme textfields etc.

Y at-il un meilleur appel que je devrais utiliser pour redimensionner l'image?

Merci, John

Était-ce utile?

La solution

Une suggestion que je peux faire est d'abord redimensionner l'image sur une directive BufferedImage . La raison, un objet Graphics2D du BufferedImage peut être obtenu de manière à produire une meilleure qualité d'image mise à l'échelle.

Graphics2D peut accepter « rendu des notes » qui instruction au traitement de l'image ainsi que doit être effectuée par l'objet Graphics2D. setRenderingHint méthode est l'une des méthodes qui peuvent être utilisées pour définir ces conseils de rendu. Le rendu des notes de la classe RenderingHints peuvent être utilisé.

Ensuite, en utilisant cet objet Graphics2D, une image peut être attirée sur le BufferedImage en utilisant les indices de rendu plus bref.

Un code rugueux (non testé) fonctionnerait comme suit:

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();

D'autres indices de rendu d'intérêt peuvent inclure:

Le Contrôle de la section de la qualité de rendu de Java Tutoriels a également plus d'informations sur la façon de contrôler la qualité de rendu des objets Graphics2D.

Et pour une très bonne source d'information sur le traitement des interfaces graphiques en général, Filthy Rich Clients par Chet Haase et Romain Guy est fortement recommandé. Il y a une section du livre qui traite de la question des images d'échelle, ce qui semble tout à fait pertinent.

Autres conseils

Peut être que vous devez appeler:

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

et

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

Coobird est juste que vous devez progressivement vers le bas à l'échelle (de préférence en utilisant BICUBIC) pour obtenir un résultat bon à la recherche d'une petite assez miniature. Image.getScaledInstance utilisé pour faire avec l'approche AREA_AVERAGED, mais il est beaucoup plus lent que la downscale incrémentale qui a été proposé à l'origine par Chris Campbell dans ses « Périls de Image.getScaledInstance () » article.

S'il vous plaît excuser l'auto-promotion, mais je roulais une poignée de « meilleures pratiques Java natives » quand il vient à l'image mise à l'échelle dans une bibliothèque appelée imgscalr .

Il est disponible sous licence Apache 2 et la source est sur GitHub; le but de la bibliothèque était de rendre l'échelle-image dans mort facile natif Java (1 classe, 5 méthodes statiques) et assurer la meilleure recherche résultat (qui est ce que vous vouliez à l'origine), le résultat le plus rapide (grande lorsque mise à l'échelle dans les grandes images ) ou un équilibre entre les deux et de laisser la bibliothèque décider lequel utiliser.

Je voulais juste une lib qui pourrait « Redimensionner mon image et sortir de mon chemin » et après avoir lu tous ces messages pendant quelques jours que je me suis adressé au point de la douleur (mon propre bien) juste tournait autour en arrière et le partage de la travailler pour quelqu'un d'autre, il peut aider.

Coobird a l'idée correcte. Je voudrais aussi essayer une interpolation RenderingHints.VALUE_INTERPOLATION_BILINEAR et voir si elle est plus agréable à la recherche. Bicubique fonctionne mieux quand upscaling, cependant. Pour obtenir les meilleurs résultats lorsque downscaling, on devrait downscale en plusieurs étapes . Tout d'abord réduire de moitié la résolution, puis réduire de moitié à nouveau, etc. jusqu'à ce que vous obtenez près de la résolution souhaitée (par exemple, vous ne pouvez pas réduire de moitié ou l'image sera trop petite). L'étape finale consiste à réduire à la résolution désirée.

Par exemple, supposons que votre image d'entrée est 800x600 et que vous voulez downscale 160x120 :

  1. Downscale 50% . -> 400x300
  2. Downscale 50% . -> 200x150
  3. Downscale 160x120 .
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top