Modifier la qualité de stockage des images JPEG en Java

Je pense qu'il y a des moments où vous souhaitez redimensionner et enregistrer une image JPEG. Si vous pouvez utiliser ImageMagick, l'histoire est rapide, mais si vous voulez vraiment la compléter avec Java uniquement, vous utiliserez ImageIO.

Cependant, veuillez noter que la méthode de mise en œuvre la plus simple définira automatiquement la qualité de sauvegarde de l'image JPEG sur «75» (vérifiez avec Java 8). J'en étais accro.

Comment spécifier la qualité du stockage

La mise en œuvre elle-même est simple, mais si vous souhaitez modifier la qualité du stockage, c'est NG.

    public static byte[] resize(final byte[] src, final double scale) throws IOException {
        try (ByteArrayInputStream is = new ByteArrayInputStream(src);
             ByteArrayOutputStream os = new ByteArrayOutputStream()) {
            BufferedImage srcImage = ImageIO.read(is);
            BufferedImage destImage = resizeImage(srcImage, scale);

            //La qualité du stockage sera de "75"
            ImageIO.write(destImage, "jpeg", os);
            return os.toByteArray();
        }
    }

Comment spécifier la qualité du stockage

C'est la bonne réponse. Vous pouvez spécifier la qualité de stockage quality de 0 à 1.0. 1.0 équivaut à la qualité 100.

    public static byte[] resize(final byte[] src, final double scale, final float quality) throws IOException {
        try (ByteArrayInputStream is = new ByteArrayInputStream(src);
             ByteArrayOutputStream os = new ByteArrayOutputStream();
             ImageOutputStream ios = ImageIO.createImageOutputStream(os)) {
            BufferedImage srcImage = ImageIO.read(is);
            BufferedImage destImage = resizeImage(srcImage, scale);

            //La qualité du stockage suit les spécifications de l'utilisateur
            ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
            ImageWriteParam param = writer.getDefaultWriteParam();
            param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            param.setCompressionQuality(quality);
            writer.setOutput(ios);
            writer.write(null, new IIOImage(destImage, null, null), param);
            writer.dispose();

            return os.toByteArray();
        }
    }

Supplément

La mise en œuvre de la méthode de redimensionnement resizeImage des deux exemples précédents est la suivante. La qualité d'image n'est pas bonne par défaut lors du redimensionnement d'une image, mais vous pouvez améliorer la qualité de l'image en spécifiant TYPE_BICUBIC lors de la conversion affine.

    public static BufferedImage resizeImage(final BufferedImage image, final double scale) throws IOException {
        int width = (int) (image.getWidth() * scale);
        int height = (int) (image.getHeight() * scale);
        BufferedImage resizedImage = new BufferedImage(width, height, image.getType());

        //Redimensionner par conversion affine (la priorité est donnée à la qualité d'image)
        AffineTransform transform = AffineTransform.getScaleInstance(scale, scale);
        AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BICUBIC);
        op.filter(image, resizedImage);

        return resizedImage;
    }

Lors du redimensionnement en Java, la charge de la mémoire et du processeur devient inacceptable à mesure que les données d'image deviennent volumineuses, donc je pense que les scènes qui peuvent être utilisées sont assez limitées.

Recommended Posts

Modifier la qualité de stockage des images JPEG en Java
L'histoire de l'écriture de Java dans Emacs
L'histoire de la comparaison de chaînes de bas niveau en Java
L'histoire de la fabrication d'un Othello ordinaire à Java
À propos de l'idée des classes anonymes en Java
L'histoire de l'apprentissage de Java dans la première programmation
Mesurer la taille d'un dossier avec Java
Ressentez le passage du temps même à Java
Importer des fichiers de la même hiérarchie en Java
Obtenez l'URL de la destination de la redirection HTTP en Java
Récapitulez les éléments supplémentaires de la classe Optional dans Java 9
Changer le codage Java dans Windows
Implémentation Java de tri-tree
A été effectué dans l'année de base de la semaine calendaire Java
Une explication rapide des cinq types de statique Java
Comment dériver le dernier jour du mois en Java
Accéder à l'interface réseau avec Java
[Java] Supprimer les éléments de la liste
Devinez le code de caractère en Java
Examiner les informations système de l'environnement d'exploitation AWS Lambda en Java
[Java] Obtenez les dates des derniers lundi et dimanche dans l'ordre
[Édition Java] Histoire de la sérialisation
Spécifiez l'emplacement Java dans eclipse.ini
Sortie de la différence entre chaque champ de deux objets en Java
Examiner la liste des polices disponibles dans AWS Lambda + Java
Liste des membres ajoutés dans Java 9
La milliseconde définie dans /lib/calendars.properties de Java jre est UTC
Analyser l'analyse syntaxique de l'API COTOHA en Java
Examinez la liste des ID de fuseau horaire disponibles dans la classe Java ZoneId
Obtenez l'URL publique du fichier privé de Flickr en Java
Prise en compte du risque de «changement de politique Java»
Créons une application TODO en Java 5 Changer l'affichage de TODO
Liste des types ajoutés dans Java 9
Ordre de traitement dans le programme
Je veux changer la valeur de l'attribut dans Selenium of Ruby
L'origine des expressions Java lambda
Implémentation d'une fonction similaire en Java
Comment obtenir la longueur d'un fichier audio avec Java
Comment incrémenter la valeur de Map sur une ligne en Java
Appelez la super méthode en Java
Augmenter dynamiquement le nombre d'éléments dans un tableau bidimensionnel Java (tableau multidimensionnel)
L'histoire de l'acquisition de Java Silver en deux mois de totalement inexpérimenté.
Ceci et cela de la mise en œuvre du jugement en temps réel des dates en Java
Comment trouver le nombre total de pages lors de la pagination en Java
Exemple de programme qui renvoie la valeur de hachage d'un fichier en Java
Comment changer la valeur d'une variable à un point d'arrêt dans intelliJ
[Communication Socket (Java)] Impressions de la mise en œuvre de la communication Socket dans la pratique pour la première fois
Comment obtenir le chemin absolu d'un répertoire s'exécutant en Java
Trouvez le maximum et le minimum des cinq nombres saisis en Java
[Java] java.lang.NoClassDefFoundError: Résolution du problème de chute dans org / jsoup / safety / Whitelist
Modifiez la destination d'enregistrement de l'image en S3 dans l'application Rails. Partie 2
Implémentation de DBlayer en Java (RDB, MySQL)
Vérifiez le contenu du magasin de certificats Java
Référence Java à comprendre dans la figure
Examiner l'utilisation de la mémoire des éléments Java
[Java] Obtenez le jour d'un jour spécifique
OCR en Java (reconnaissance de caractères à partir d'images)
Essayez d'utiliser l'API Stream en Java
Appelez l'API de notification Windows en Java