Sonntag, Juli 5, 2020

Programmatisch Verringerung der JPEG-Datei-Größe

Entschuldigen für die Unwissenheit, aber ich war noch nie mit jpeg-Bilder (geschweige denn irgendwelche Arten von Bildern) in Java vor.

Angenommen, ich will zu schicken, um ein jpeg-Bild von einem web service client. Gibt es eine Möglichkeit, dass ich reduzieren kann die jpeg-Dateigröße durch die Manipulation mit dem Farbprofil des Bildes in irgendeiner Weise?

Habe ich bereits in der Lage, reduzieren Sie die Größe des Bildes durch Skalierung mit einem praktischen Werkzeug für BufferedImages genannt imgscalr. Sehen hier.

Ich würde auch gerne ein jpeg weniger Farben als hochwertige jpeg-Bild. Zum Beispiel, ich möchte in der Lage sein zu verwenden, 8bit Farbe in meine jpeg anstatt zu sagen, 16bit Farbe.

Was genau müsste ich ändern, wenn ich ein BufferedImage von der Java-2D-Paket?

InformationsquelleAutor Joeblackdev | 2011-07-26

4 Kommentare

  1. 4

    Einer anderen Weise zu reduzieren, Bild-Größe ändern-Komprimierung Ebene. Sie können tun, dass mit ImageWriter.

        ImageWriter writer = null;
        Iterator<ImageWriter> iwi = ImageIO.getImageWritersByFormatName("jpg");
        if (!iwi.hasNext())
            return;
        writer = (ImageWriter) iwi.next();
        ImageWriteParam iwp = writer.getDefaultWriteParam();
        iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT) ;
        iwp.setCompressionQuality(compressionQuality);
        writer.setOutput(...);
        writer.write(null, image, iwp);
    • Hallo, Welche Auswirkungen (optisch) wird die änderung der Komprimierung der jpeg-haben? Dank
    • Werfen Sie einen Blick auf diese post codinghorror.com/blog/2006/07/…
    • Ich nehme einen genaueren Blick, danke für den link. Ich Frage mich jedoch, ob es eine Möglichkeit (anhand der Bilder im link) zu sagen, verwenden Sie weniger Farben im jpeg? Zum Beispiel mit 8bit Farben statt 16-bit-Farbe? Dank
    • Das ist die Antwort. JPEGs funktionieren nur mit voller Farbpalette. Wenn Sie möchten, verwenden Sie ein anderes format (png oder gif) als Sie haben die Wahl zu verkürzen, die palette.
    • hast du ein Beispiel irgendwo der Verkürzung der palette mit PNG-Bildern?
    • Werfen Sie einen Blick auf die Bilder in en.wikipedia.org/wiki/Dither und en.wikipedia.org/wiki/List_of_monochrome_and_RGB_palettes. Das beste ist, zu laden, bis Photoshop oder Gimp, und versuchen Sie „für web speichern“ – Funktion oder etwas ähnliches. Es gibt Sie interaktives Dialogfeld, in dem Sie Optionen festlegen können (einschließlich palette-Größe) und die Ergebnisse sofort. Ich bin mir ziemlich sicher, Du wirst am Ende mit jpegs und Verdichtung statt-palette Reduzierung (wenn Farbverläufe Dominieren über flache Ton-Regionen, das ist immer der Fall mit echten Fotos).
    • Dithering ist eine option, wenn dewird für das komprimieren einer JPEG-Bild. Jedoch, im Rahmen der JPEG-Kompression Methode selbst, die Reduzierung der Farbpalette macht keinen Sinn, wie JPEG verwendet eine grundlegend analoge Methode. Sie können etwas Platz sparen, indem Sie schwarz&weiß, obwohl.

  2. 1

    Der einfachste Weg, dies zu tun ist, um Dekomprimieren Sie die byte-stream in ein Java-Image, Optional auch die Größe ändern (das macht es noch kleiner machen) und dann neu erstellen Sie ein JPEG-Bild aus dieser mit die gewünschte Einstellung für die Qualität.

    Dieses neue Bild ist, was ist dann an den client gesendet.

    • Vielen Dank für diese, aber dies ist genau das, was ich habe, so weit. Ich benutze ein tool namens imgscalr, um die Größe des jpeg-Bild, bevor es an den client gesendet wird. Allerdings würde ich auch gerne ein update der Farbe Profil des jpeg zu verringern, die Farben, die in der jpeg. Von „reduzieren“ ich meine, verwenden Sie weniger Farben. Ich bin nicht sicher, dass die Terminologie dieser…
  3. 1

    Haben Sie einen Blick auf die ImageIO Klasse. Wie für die Verringerung der Datei-Größe: da das Bild bereits ein JPEG nur Dinge, die Sie tun können, reduzieren Sie die Qualität oder die Größe des Bildes.

    Andere Sache im Auge zu behalten: wenn das Bild ein CMYK-jpeg, es könnte größer sein. Leider ImageIO nicht umgehen kann, aber Sie können versuchen JAI ImageIO zum konvertieren von CMYK-zu-RGB (die sollten viel kleiner sein).

  4. 1

    Zwei der möglichen Lösungen sind Hardware-Herunterskalierung in Echtzeit das Bild, hier ist, wie Sie es tun würde:

    BufferedImage original = //your image here
    scaled = original.getScaledInstance(finalWidth, finalHeight, Image.SCALE_SMOOTH); //scale the image to a smaller one
    
    BufferedImage result = new BufferedImage(finalWidth, finalHeight, original.getType());
    Graphics2D g = result.createGraphics();     
    
    g.drawImage(scaled, 0, 0, null); //draw the smaller image
    g.dispose();

    Offensichtlich haben Sie berechnen die skalierte Breite und Höhe, also das Bild bleibt durch die gleiche Seitenverhältnis.

    Sobald Sie gezeichnet haben es kleiner ist, können Sie nun drehen Sie das Bild in eine JPEG-Datei:

    BufferedImage image = //this is the final scaled down image
    
    JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(output);
    JPEGEncodeParam jpegEncodeParam = jpegEncoder.getDefaultJPEGEncodeParam(image);
    
    jpegEncodeParam.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
    jpegEncodeParam.setXDensity(92);
    jpegEncodeParam.setYDensity(92);
    
    jpegEncodeParam.setQuality( 0.8F , false);
    jpegEncoder.encode(image, jpegEncodeParam);

    Diese Klassen sind von der JAI – Paket (genauer com.sun.image.codec.jpeg) und die JVM könnte sich darüber beschweren, dass Sie sollten nicht direkt verwendet werden, aber Sie können Sie ignorieren.

    Können Sie möglicherweise download JAI aus hier, wenn es nicht funktioniert, ich habe github Spiegel setup für die beiden Bibliotheken, JAI core und JAI ImageIO.

Kostenlose Online-Tests