So erhalten Sie ein qualitativ hochwertiges Thumbnail

Ich versuche zu erstellen hochwertige Miniatur dieses Bild, mit Java und Scalr 3.2

So erhalten Sie ein qualitativ hochwertiges Thumbnail

Dies ist der relevante source code, wo THUMB_WIDTH = 77 und THUMB_HEIGHT = 57

BufferedImage srcImg = ImageIO.read(new File(sourceFile)); 
BufferedImage dstImg = Scalr.resize(srcImg, Scalr.Method.QUALITY, 
    THUMB_WIDTH, THUMB_HEIGHT); 
ImageIO.write(dstImg, format, new File(destFile));

Wenn ich format = "png", hier ist das Ergebnis:

So erhalten Sie ein qualitativ hochwertiges Thumbnail

Wenn ich format = "jpg", hier ist das Ergebnis:

So erhalten Sie ein qualitativ hochwertiges Thumbnail

Mit imagemagick identifizieren ich habe herausgefunden, dass die JPEG-Datei wird gespeichert mit einer Qualität von 75, ist völlig unzureichend, um erstellen Sie eine gut aussehende Miniatur. Das PNG sieht nicht so gut zu mir.

Hier ist die Ausgabe identifizieren der original-Datei und die zwei miniaturen:

$ identify 42486_1.jpg 42486_s1.jpg 42486_s1.png 
42486_1.jpg JPEG 580x435 580x435+0+0 8-bit DirectClass 50.6KB 0.000u 0:00.000
42486_s1.jpg[1] JPEG 77x58 77x58+0+0 8-bit DirectClass 2.22KB 0.000u 0:00.000
42486_s1.png[2] PNG 77x58 77x58+0+0 8-bit DirectClass 12.2KB 0.000u 0:00.000

Fragen

  • Wie die Verbesserung der Qualität der generierten thumbnail?
  • So speichern Sie ein JPEG-Bild mit höherer Qualität? Ich möchte versuchen, mit höherer Qualität und die Ergebnisse vergleichen. Ich konnte nicht finden, dass irgendetwas in der JavaDoc für ImageIO.schreiben.
  • Warum ich sagen, Scalr, dass meine maximale Abmessungen sind 77x57 und-Ausgang ein Bild 77x58? Ich denke, dass ist die Wahrung der Proportionen, aber das sind meine maximale Breite und maximale Höhe. Breite oder Höhe könnte weniger sein aber nicht mehr.

UPDATE: Mit einer Suche im web fand ich einen Artikel darüber, wie passen Sie die JPEG-Bildkomprimierung Qualität. Ich schrieb meine eigene Methode zum speichern eines BufferedImage Einstellung der Qualität:

/**
 * Write a JPEG file setting the compression quality.
 * 
 * @param image
 *                a BufferedImage to be saved
 * @param destFile
 *                destination file (absolute or relative path)
 * @param quality
 *                a float between 0 and 1, where 1 means uncompressed.
 * @throws IOException
 *                 in case of problems writing the file
 */
private void writeJpeg(BufferedImage image, String destFile, float quality) 
throws IOException {
    ImageWriter writer = null;
    FileImageOutputStream output = null;
    try {
        writer = ImageIO.getImageWritersByFormatName("jpeg").next();
        ImageWriteParam param = writer.getDefaultWriteParam();
        param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        param.setCompressionQuality(quality);
        output = new FileImageOutputStream(new File(destFile));
        writer.setOutput(output);
        IIOImage iioImage = new IIOImage(image, null, null);
        writer.write(null, iioImage, param);
    } catch (IOException ex) {
        throw ex;
    } finally {
        if (writer != null) writer.dispose();
        if (output != null) output.close();
    }
}

Hier sind die Ergebnisse. PNG:

So erhalten Sie ein qualitativ hochwertiges Thumbnail

JPEG-Qualität 75:

So erhalten Sie ein qualitativ hochwertiges Thumbnail

JPEG-Qualität 90 (die gravatars auf stackoverflow gespeichert werden als JPEG-Qualität 90):

So erhalten Sie ein qualitativ hochwertiges Thumbnail

und die filesize:

thumb90.jpg JPEG 77x58 77x58+0+0 8-bit DirectClass 6.89KB 0.000u 0:00.000

UPDATE 2: test zum Vergleich Scalr mit java-Bild-Skalierung.

private void scaleAndSaveImageWithScalr(String sourceFile, String destFile, int width, int height)
    throws IOException {
    BufferedImage sourceImage = ImageIO.read(new File(sourceFile));
    BufferedImage destImage = Scalr.resize(sourceImage, Scalr.Method.QUALITY, width, height);
    writeJpeg(destImage, destFile, JPEG_QUALITY);
}

private void scaleAndSaveImageWithJImage(String sourceFile, String destFile, int width, int height)
    throws IOException {
    BufferedImage sourceImage = ImageIO.read(new File(sourceFile));
    ResampleOp resampleOp = new ResampleOp(width, height);
    resampleOp.setFilter(ResampleFilters.getLanczos3Filter());
    resampleOp.setUnsharpenMask(AdvancedResizeOp.UnsharpenMask.Normal);
    BufferedImage destImage = resampleOp.filter(sourceImage, null);
    writeJpeg(destImage, destFile, JPEG_QUALITY);
}

JPEG-Qualität 90 erzeugt mit Scalr:

So erhalten Sie ein qualitativ hochwertiges Thumbnail

JPEG-Qualität 90 erzeugt mit java-Bild-Skalierung:

So erhalten Sie ein qualitativ hochwertiges Thumbnail

Habe ich nicht erhalten keine weitere Rückmeldung, also mein persönliches Fazit ist, dass die java-Bild-Skalierung bietet eine überragende Qualität, und so ist es der Bibliothek, die ich wähle.

Kommentar zu dem Problem
Hi @Riyad, vielen Dank für das teilen Scalr. Ich versuche es, und ich habe einige Schwierigkeiten, können Sie einen Blick darauf werfen und mir einen Tip geben? Kommentarautor: stivlo
writeJpeg() aufrufen muss writer.dispose() und ausgegeben.close() in endlich - block zur Freigabe dieser Ressourcen! Kommentarautor: user113215
@user113215, danke, ich habe aktualisiert die sample-code wie vorgeschlagen. Kommentarautor: stivlo
danke für das teilen der writeJpeg () - Methode! Dies war das fehlende puzzle-Stück zu Scalr.ändern der Größe. Kommentarautor: user1813222

InformationsquelleAutor der Frage stivlo | 2011-10-12

Schreibe einen Kommentar