Ändern Sie die Speicherqualität von JPEG-Bildern in Java

Ich denke, es gibt Zeiten, in denen Sie die Größe eines JPEG-Bildes ändern und es speichern möchten. Wenn Sie ImageMagick verwenden können, ist die Geschichte schnell, aber wenn Sie sie wirklich nur mit Java vervollständigen möchten, verwenden Sie ImageIO.

Beachten Sie jedoch, dass die einfachste Implementierungsmethode die Speicherqualität des JPEG-Bilds automatisch auf "75" setzt (überprüfen Sie dies mit Java 8). Ich war süchtig danach.

So legen Sie die Speicherqualität fest

Die Implementierung selbst ist einfach, aber wenn Sie die Speicherqualität ändern möchten, ist dies 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);

            //Die Speicherqualität beträgt "75".
            ImageIO.write(destImage, "jpeg", os);
            return os.toByteArray();
        }
    }

So legen Sie die Speicherqualität fest

Dies ist die richtige Antwort. Sie können die Speicherqualität "Qualität" von 0 bis 1,0 angeben. 1,0 entspricht der Qualität 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);

            //Die Speicherqualität entspricht den Benutzerspezifikationen
            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();
        }
    }

Ergänzung

Die Implementierung der Größenänderungsmethode "resizeImage", die in den beiden vorherigen Beispielen angezeigt wird, ist wie folgt. Die Bildqualität ist beim Ändern der Bildgröße standardmäßig nicht gut. Sie können die Bildqualität jedoch verbessern, indem Sie bei der Konvertierung in Affin "TYPE_BICUBIC" angeben.

    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());

        //Größenänderung durch affine Konvertierung (Priorität hat die Bildqualität)
        AffineTransform transform = AffineTransform.getScaleInstance(scale, scale);
        AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BICUBIC);
        op.filter(image, resizedImage);

        return resizedImage;
    }

Bei der Größenänderung in Java wird die Speicher- und CPU-Auslastung unannehmbar groß, wenn die Bilddaten groß werden. Daher denke ich, dass die Szenen, die verwendet werden können, sehr begrenzt sind.

Recommended Posts

Ändern Sie die Speicherqualität von JPEG-Bildern in Java
Die Geschichte des Schreibens von Java in Emacs
Die Geschichte des einfachen String-Vergleichs in Java
Die Geschichte eines gewöhnlichen Othello in Java
Über die Idee anonymer Klassen in Java
Die Geschichte des Lernens von Java in der ersten Programmierung
Messen Sie die Größe eines Ordners mit Java
Spüren Sie den Lauf der Zeit auch in Java
Importieren Sie Dateien derselben Hierarchie in Java
Rufen Sie die URL des HTTP-Umleitungsziels in Java ab
Fassen Sie die zusätzlichen Elemente der optionalen Klasse in Java 9 zusammen
Ändern Sie die Java-Codierung in Windows
Java-Implementierung von Tri-Tree
Wurde im Basisjahr der Java-Kalenderwoche durchgeführt
Eine kurze Erklärung der fünf Arten von Java Static
So leiten Sie den letzten Tag des Monats in Java ab
Greifen Sie mit Java auf die Netzwerkschnittstelle zu
[Java] Löschen Sie die Elemente von List
Errate den Zeichencode in Java
Untersuchen Sie die Systeminformationen der AWS Lambda-Betriebsumgebung in Java
[Java] Ordnen Sie die Daten des vergangenen Montags und Sonntags der Reihe nach an
[Java Edition] Geschichte der Serialisierung
Geben Sie den Java-Speicherort in eclipse.ini an
Geben Sie die Differenz zwischen jedem Feld zweier Objekte in Java aus
Untersuchen Sie die Liste der in AWS Lambda + Java verfügbaren Schriftarten
Liste der in Java 9 hinzugefügten Mitglieder
Die in /lib/calendars.properties von Java jre festgelegte Millisekunde ist UTC
Analysieren der COTOHA-API-Syntaxanalyse in Java
Untersuchen Sie die Liste der Zeitzonen-IDs, die in der Java ZoneId-Klasse verfügbar sind
Rufen Sie die öffentliche URL der privaten Datei von Flickr in Java ab
Berücksichtigung des Risikos "Änderung der Java-Richtlinie"
Lassen Sie uns eine TODO-App in Java 5 erstellen. Schalten Sie die Anzeige von TODO um
Liste der in Java 9 hinzugefügten Typen
Reihenfolge der Verarbeitung im Programm
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
Der Ursprung von Java-Lambda-Ausdrücken
Implementierung einer ähnlichen Funktion in Java
So ermitteln Sie die Länge einer Audiodatei mit Java
So erhöhen Sie den Wert von Map in einer Zeile in Java
Rufen Sie die Super-Methode in Java auf
Erhöhen Sie dynamisch die Anzahl der Elemente in einem zweidimensionalen Java-Array (mehrdimensionales Array).
Die Geschichte des Erwerbs von Java Silver in zwei Monaten von völlig unerfahrenen.
Dies und das der Implementierung der zeitlichen Beurteilung von Daten in Java
So ermitteln Sie die Gesamtzahl der Seiten beim Paging in Java
Beispielprogramm, das den Hashwert einer Datei in Java zurückgibt
So ändern Sie den Wert einer Variablen an einem Haltepunkt in IntelliJ
[Socket-Kommunikation (Java)] Eindrücke von der erstmaligen Implementierung der Socket-Kommunikation in der Praxis
So ermitteln Sie den absoluten Pfad eines in Java ausgeführten Verzeichnisses
Finden Sie das Maximum und Minimum der fünf in Java eingegebenen Zahlen
[Java] java.lang.NoClassDefFoundError: Behebung des Problems, in org / jsoup / security / Whitelist zu fallen
Ändern Sie das Speicherziel des Bildes in der Rails-App in S3. Teil 2
Implementierung von DBlayer in Java (RDB, MySQL)
Überprüfen Sie den Inhalt des Java-Zertifikatspeichers
Java-Referenz zum Verständnis in der Abbildung
Untersuchen Sie die Speichernutzung von Java-Elementen
[Java] Ermittelt den Tag eines bestimmten Tages
OCR in Java (Zeichenerkennung aus Bildern)
Versuchen Sie es mit der Stream-API in Java
Rufen Sie die Windows-Benachrichtigungs-API in Java auf