J’ai besoin de redimensionner les fichiers PNG, JPEG et GIF. Comment puis-je faire cela en utilisant Java ?
Réponses
Trop de publicités?FWIW, je viens juste de sortir (Apache 2, hébergé sur GitHub) une simple image mise à l'échelle de la bibliothèque Java appelé imgscalr.
La bibliothèque met en œuvre différentes approches de l'image mise à l'échelle (y compris Chris Campbell approche progressive avec quelques améliorations mineures) et choisir la meilleure approche pour vous si vous le demandez, ou de vous donner le plus rapide ou le plus beau (si vous vous demandez ce que c').
L'utilisation est très simple, juste un tas de méthodes statiques. Le plus simple des cas d'utilisation est:
BufferedImage scaledImage = Scalr.resize(myImage, 200);
Toutes les opérations de maintenir l'image de l'proportions d'origine, dans ce cas, vous demandez imgscalr pour redimensionner votre image à l'intérieur d'une des limites de 200 pixels de largeur et 200 pixels de hauteur, et par défaut, il permet de sélectionner automatiquement le meilleur et le plus rapide approche pour cela car il n'a pas été spécifiée.
Je me rends compte sur le départ, cela ressemble à de l'auto-promotion (il est), mais j'ai passé ma juste part de temps de googler ce même sujet et a cessé de venir avec des résultats différents/approches/idées/suggestions et a décidé de s'asseoir et d'écrire une simple mise en œuvre qui porterait que 80% à 85% des cas d'utilisation où vous avez une image et probablement envie d'en miniature pour qu'il soit aussi rapide que possible, ou comme la recherche de bonnes que possible (pour ceux qui ont essayé, vous remarquerez faire un Graphique.drawImage même avec l'interpolation BICUBIQUE à une assez petite de l'image, il ressemble encore à la poubelle).
Après avoir chargé l'image, vous pouvez essayer:
BufferedImage createResizedCopy(Image originalImage,
int scaledWidth, int scaledHeight,
boolean preserveAlpha)
{
System.out.println("resizing...");
int imageType = preserveAlpha ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
BufferedImage scaledBI = new BufferedImage(scaledWidth, scaledHeight, imageType);
Graphics2D g = scaledBI.createGraphics();
if (preserveAlpha) {
g.setComposite(AlphaComposite.Src);
}
g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null);
g.dispose();
return scaledBI;
}
Thumbnailator est un open-source de redimensionnement d'image de la bibliothèque Java avec une interface fluide, distribué sous la licence MIT.
J'ai écrit cette bibliothèque en raison de haute qualité à des vignettes en Java peut être étonnamment difficile, et que le code résultant peut être assez compliqué. Avec Thumbnailator, il est possible d'exprimer assez de tâches complexes à l'aide d'une simple API fluent.
Un exemple simple
Pour simple exemple, de prendre une image et la redimensionner à 100 x 100 (en conservant le ratio d'aspect de l'image d'origine), et de les enregistrer dans un fichier peut être réalisé en une seule instruction:
Thumbnails.of("path/to/image")
.size(100, 100)
.toFiles("path/to/thumbnail");
Un exemple avancé
Réaliser la complexité de redimensionnement des tâches est simplifiée avec Thumbnailator de l'interface fluide.
Supposons que nous voulons faire ce qui suit:
- prendre les images dans un répertoire et,
- redimensionner à 100 x 100, avec le ratio d'aspect de l'image d'origine,
- tous les enregistrer au format Jpeg avec les paramètres de qualité de l'
0.85
, - d'où les noms de fichier sont pris à partir de l'original,
thumbnail.
ajouté au début
Traduit de Thumbnailator, nous serions en mesure d'effectuer ce qui précède avec les éléments suivants:
Thumbnails.of(new File("path/to/directory").listFiles())
.size(100, 100)
.outputFormat("JPEG")
.outputQuality(0.85)
.toFiles(Rename.PREFIX_DOT_THUMBNAIL);
Une remarque à propos de la qualité de l'image et de la vitesse
Cette bibliothèque utilise également le progressif bilinéaire de mise à l'échelle de la méthode mis en évidence dans Filthy Rich Clients par Chet Haase et Romain Guy, afin de générer de haute qualité des vignettes, tout en assurant l'exécution acceptable de performance.
Vous n'avez pas besoin d'une bibliothèque pour cela. Vous pouvez le faire avec Java lui-même.
Chris Campbell a un excellent et détaillé compte rendu sur la mise à l'échelle des images - voir cet article .
Chet Haase et Romain Guy ont également un compte rendu détaillé et très informatif de la mise à l'échelle de l'image dans leur livre, Filthy Rich Clients .
Java Advanced Imaging est maintenant open source et fournit les opérations dont vous avez besoin.