Comment redimensionner une image à l'aide de Java?
J'ai besoin de redimensionner PNG, JPEG et GIF. Comment puis-je faire cela à l'aide de Java?
- depuis que vous avez demandé une bibliothèque, la vraie réponse est ici: stackoverflow.com/questions/244164/.... Il est beaucoup plus facile à utiliser que le code de la accepté de répondre 😉
- Je suis en désaccord sur la bibliothèque de la partie: Graphics2D fait partie de la bibliothèque awt et il est open source. Pour la dernière partie (open source), je ne suis pas sûr à 100%, mais qui regarde l'awt code de toute façon?
Vous devez vous connecter pour publier un commentaire.
Après le chargement de l'image, vous pouvez essayer:
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 (disponible sur Maven central).
La bibliothèque implémente un peu 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:
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).
new ImageScaler(img).resizeTo(...).rotate(...).cropTo(...).toOutputBuffer()
. J'aime votre façon trop et je pense que c'est plus simple.Thumbnailator est un open-source de redimensionnement d'image de la bibliothèque Java avec une interface fluide, distribué en vertu de 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 un 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:
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:
0.85
,thumbnail.
ajouté au débutTraduit de Thumbnailator, nous serions en mesure d'effectuer ce qui précède avec les éléments suivants:
Une remarque à propos de la qualité de l'image et de la vitesse
Cette bibliothèque utilise également le progressive bilinéaire de mise à l'échelle 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.
Thumbnails.of(..).size(80,80).crop(Positions.CENTER).toFile( ... )
. Ce sera d'abord redimensionner la largeur ou la hauteur de 80 et après la récolte du centre.Vous n'avez pas besoin d'une bibliothèque pour ce faire. Vous pouvez le faire avec Java lui-même.
Chris Campbell a un excellent et détaillé écriture-up sur la mise à l'échelle des images - voir cet article.
Chet Haase et Romain Guy aussi détaillée et très instructive écriture-up de 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.
Si vous êtes aux prises avec de grandes images ou souhaitez un joli résultat ce n'est pas une tâche triviale en java. Tout simplement le faire par l'intermédiaire d'un rescale op via Graphics2D ne va pas créer une haute qualité de vignettes. Vous pouvez le faire en utilisant JAI, mais cela nécessite plus de travail que vous ne l'imaginez pour obtenir quelque chose qui ressemble bien et JAI a la fâcheuse habitude de souffler notre votre JVM avec OutOfMemory erreurs.
Je suggère d'utiliser ImageMagick comme un exécutable externe si vous pouvez sortir avec elle. Son simple à utiliser et il fait le travail à droite de sorte que vous n'avez pas à.
Si imagemagick est installé sur votre machine est une option, je recommande im4java. C'est une très mince couche d'abstraction sur l'interface de ligne de commande, mais fait son travail très bien.
De l'API Java ne fournit pas de fonction de mise à l'échelle standard pour les images et la dégradation de la qualité d'image.
Cette raison, j'ai essayé d'utiliser cvResize de JavaCV mais il semble causer des problèmes.
J'ai trouvé une bonne bibliothèque de l'image mise à l'échelle: il suffit d'ajouter la dépendance "java-image-mise à l'échelle" dans votre pom.xml.
Dans le repository maven, vous obtiendrez la version récente pour cette.
Ex. Dans votre programme java
Vous pouvez essayer d'utiliser GraphicsMagick Système De Traitement D'Image avec im4java comme une carte en ligne de l'interface Java.
Il y a beaucoup d'avantages de GraphicsMagick, mais un pour tous:
fichiers le plus vaste au monde de la photo
(par exemple sites Flickr et Etsy).
Image Magick a été mentionné. Il y a un JNI avant la fin du projet appelé JMagick. Il n'est pas particulièrement stable projet (et feut lui-même a été appelé à changer beaucoup de choses et même de casser la compatibilité). Cela dit, nous avons eu une bonne expérience de l'utilisation de JMagick et une version compatible de l'Image Magick dans un environnement de production pour effectuer la mise à l'échelle à un débit élevé, faible taux de latence. La vitesse était beaucoup mieux ensuite avec un tout Java bibliothèque graphique que nous avons déjà essayé.
http://www.jmagick.org/index.html
Simplement utiliser Burkhard la réponse, mais ajoutez cette ligne après la création de la carte graphique:
Vous pouvez également définir la valeur de BICUBIQUE, il va produire une meilleure qualité d'image mais c'est un plus cher de l'opération. Il y a d'autres rendu des conseils, que vous pouvez définir, mais j'ai trouvé que l'interpolation qui produit le plus d'effet notable.
Gardez à l'esprit si vous voulez zoomer dans un lot, le code java le plus probable sera très lent. - Je trouver de plus grandes images commencent à produire le décalage de près de 300% de zoom, même avec tout le rendu des conseils de jeu pour optimiser la vitesse au détriment de la qualité.
Vous pouvez utiliser Marvin (pur Java framework de traitement d'image) pour ce genre d'opération:
http://marvinproject.sourceforge.net
Échelle plug-in:
http://marvinproject.sourceforge.net/en/plugins/scale.html
Il s'avère que la rédaction d'un puissant convertisseur n'est pas trivial. Je l'ai fait une fois pour un projet open source: ImageScaler.
En principe " de java.awt.Image#getScaledInstance(int, int, int)' pour faire le travail aussi bien, mais il y a un méchant bug avec cette - voir mon lien pour plus de détails.
J'ai développé une solution avec l'librement classes disponibles ( AnimatedGifEncoder, GifDecoder, et LWZEncoder) disponibles pour la manutention d'Animation GIF.
Vous pouvez télécharger le jgifcode bocal et exécuter le GifImageUtil classe.
Lien: http://www.jgifcode.com
vous pouvez utiliser la suite populaire: thumbnailator
Si vous ne voulez pas importer imgScalr comme @Riyad Kalla réponse au-dessus de laquelle j'ai testé fonctionne très bien, vous pouvez le faire
prises de Peter Walser répondre @Peter Walser sur une autre question cependant: