Qualité de redimensionnement de l'image (Java)
J'ai un open-source application qui télécharge les photos de Facebook. Pour économiser de la bande passante, les photos sont automatiquement redimensionnées avant de les télécharger (Facebook impose une limite de taille maximale). Quelques personnes se sont plaints de la qualité de la photo, et en fait, vous pouvez voir la différence (voir ce problème pour quelques images de démo).
Donc ma question est, quelle est la "meilleure" façon de réduire les images (c'est à dire des photos) en Java, sans perte de qualité, ou au moins, avec un minimum de perte de qualité /artefacts?
Vous pouvez voir le code actuel, j'ai ici (code de redimensionnement via cette page).
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Je l'ai essayé tous les trucs iciet tout ce que je peux vous dire que vous êtes mieux d'utiliser ImageMagick avec quelle que soit l'interface, Javas imagerie bibliothèques sont tout simplement pas à la hauteur quand il s'agit de cela. Vous devez supporter de nombreux formats et des algorithmes pour obtenir ce droit.
Phil, je ne sais pas quelle solution vous finalement fait avec, mais mise à l'échelle des images en Java peut regarder assez bon si vous:
J'ai fait une juste part des tests avec ces méthodes et les différentiels de mise à l'échelle le long avec de la colle à bien pris en charge types d'image est la clé, je vois que Alexander a dit qu'il n'a toujours pas compris bonne chance, et c'est une déception.
J'ai sorti le imgscalr bibliothèque (Apache 2) sur 6 mois pour répondre à la question "je veux une bonne prospectifs échelle des copies de cette image, C'est MAINTENANT!" après avoir lu quelque chose comme 10 questions de ce genre sur.
Utilisation Standard ressemble:
Le 2ème argument est que la sélection de la largeur et de la hauteur imgscalr va utiliser à l'échelle de l'image en conservant ses proportions correctes même si vous avez passé dans invalide dimensions -- il y a beaucoup de plus détaillée des méthodesmais c'est le plus simple d'utilisation.
Les cas d'utilisation que vous voulez, par exemple, si Facebook limitée des images à une résolution de 800x600 pixels, ressemble à ceci:
Qui permettra de s'assurer que l'image reste dans la meilleure image pris en charge, le type et l'échelle la plus haute qualité de la méthode que Java peut rassembler.
Dans mon propre haute résolution essais je n'ai pas remarqué tout béant divergences avec l'échelle des images à l'aide de cette bibliothèque/ces méthodes, SAUF lorsque votre image est mis dans un mal pris en charge type d'image par le ImageIO chargeur, par exemple, ce qui arrive beaucoup avec des GIFs. Si vous les laisser comme ça et de ne pas les faire sortir de ces mal pris en charge types, il finit par regarder vraiment dégradée et terrible.
La raison pour cela est que la Java2D de l'équipe a en fait différentes d'une accélération matérielle des pipelines pour tous les différents types de BufferedImages que le JDK processus - un sous-ensemble de ces types d'images qui sont de moins en moins commun, tous utilisent le même logiciel pipeline de rendu sous les couvertures en Java2D, ce qui entraîne un mauvais et parfois totalement incorrecte à la recherche d'images. C'était une EFVP pour expliquer et essayer de comprendre que j'ai juste écrit que la logique directement dans la bibliothèque.
Les deux meilleurs types pris en charge sont BufferedImage.TYPE_INT_RGB et _ARGB si vous êtes curieux.
Pour redimensionner l'image à la coutume de la qualité de l'utiliser thumbnailator.jar.
Exemple De Code
http://code.google.com/p/thumbnailator/wiki/Examples
Deux des plus populaires de l'open source libs spécialisée dans le redimensionnement d'image en java actuellement sont:
Supplémentaire, il est le JDK façon avec Java
Graphics2D
(voir cette question sur la façon de le faire) qui est tristement célèbre pour créer mauvais résultats, en particulier avec la réduction d'échelle. Il y a aussi un L'interface Java pour ImageMagick qui seront omis ici, car il nécessite un outil externe.Qualité Visuelle
Ici est une comparaison des résultats de redimensionnement/downscaling un
580x852
png145x213
. Comme référence Photoshop CS5 "enregistrer pour le web" redimensionnement est utilisé. Remarque: les résultats sont de 1:1 ce que les libs créé juste copié ensemble. Le zoom n'utilise pas de filtrage, juste un simple algorithme d'approximation. Ici vous pouvez trouver l'image d'origine.Je laisse au lecteur le soin de sélectionner le meilleur résultat que c'est subjectif. En général, tous ont un bon de sortie, sauf
Graphics2D
. Thumbnailator génère des images plus précises très similaire à Photoshop de sortie, alors que imgscalr de sortie est considérablement plus doux. Pour les icônes/texte etc. vous souhaitez davantage de sortie, pour les photos vous souhaitez peut-être plus doux de sortie.Temps De Calcul
Ici, c'est non-scientifique de référence à l'aide de cette outil et 114 images, avec la dimension d'environ
96x96
jusqu'à2560x1440
de les traiter comme 425% des images de la création: 100%, 150%, 200%, 300% et 400% versions mises à l'échelle de l' (114 * 5 opérations de changement d'échelle). Toutes les libs utiliser les mêmes paramètres que dans la qualité de comparaison (de sorte que la plus haute qualité possible). Les temps ne sont pas de mise à l'échelle de l'ensemble du processus. Fait sur un i5-2520M avec 8GO de Ram et 5 pistes.Voici le code utilisé dans ce test.
Il est intéressant de noter Thumbnailator est aussi la plus rapide, avec une moyenne de 6,9 sec suivie par Java2D avec 7.2 sec laissant imgscalr derrière avec une mauvaise 26.2 sec. Ce n'est probablement pas juste depuis imgscalr est fixé à
ULTRA_QUALITY
qui semble être extrêmement coûteux; avec laQUALITY
réglage des moyennes à davantage de concurrence, 11.1 sec.Rendu astuce utilisez-vous? Généralement rééchantillonnage bicubique sera le meilleur. Dans les photos que vous liez ils sont très surprenant, ce qui me fait penser que vous utilisez le plus proche voisin comme votre indice.
Dans le PictureScaler classe que vous faites le lien, dans le
paintComponent
méthode, il utilise six différents moyens de redimensionnement de l'image. Avez-vous essayé tous les six pour voir qui donne le meilleur résultat?Après un peu frustrant expériences, j'ai trouvé le suivant redimensionner l'évaluationet a employé le multi-pass approche dans mon projet.
À faire que j'ai copié le getScaledInstance() la méthode dans ma vignette générateur de classe, changé mon image de lecture de l'approche à utiliser ImageIO (que l'on retourne une BufferedImage) et je suis maintenant très heureux!
J'ai comparé le résultat avec un redimensionnement fait dans Photoshop CS3, et le résultat est sensiblement le même.
Je voulais plus haute qualité redimensionner avec un ratio d'aspect préservé.
Essayé quelques petites choses et de lire plusieurs entrées. Perdu deux jours et à la fin j'ai obtenu le meilleur résultat avec plaine de la méthode Java (essayé aussi ImageMagick et java-image-mise à l'échelle des bibliothèques):