131 votes

Comment puis-je redimensionner une image à l’aide de Java ?

J’ai besoin de redimensionner les fichiers PNG, JPEG et GIF. Comment puis-je faire cela en utilisant Java ?

186voto

Riyad Kalla Points 6064

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

90voto

Burkhard Points 6734

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;
    }
 

56voto

coobird Points 70356

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:

  1. prendre les images dans un répertoire et,
  2. redimensionner à 100 x 100, avec le ratio d'aspect de l'image d'origine,
  3. tous les enregistrer au format Jpeg avec les paramètres de qualité de l' 0.85,
  4. 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.

13voto

David Koelle Points 10363

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 .

10voto

Ken Gentle Points 10162

Java Advanced Imaging est maintenant open source et fournit les opérations dont vous avez besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X