Die richtige Ersatz für die Nutzung der Sonne internen com.sun.image.codec.jpeg Paket?

StackOverflow https://stackoverflow.com/questions/1359904

  •  20-09-2019
  •  | 
  •  

Frage

Wir haben einige Code herum zu treten, dass Anwendungen dieses alte interne Sun Paket Bilder für die Manipulation, im Wesentlichen JPEGs kodieren, auf eine bestimmte Größe und Qualität nach dem Lesen in / Decodierung von einem Eingabestrom. Code-Beispiele unten. Ich würde ein Best-Practice-Austausch am Beispiel richtigen Java zu schätzen wissen. * Oder javax. * APIs.

private void encodeJPEG(BufferedImage bi, BufferedOutputStream out, float quality) throws
  ImageFormatException, IOException {
 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
 JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
 param.setQuality(quality, false);
 param.setDensityUnit(DENSITY_UNIT);
 param.setXDensity(DENSITY);
 param.setYDensity(DENSITY);
 encoder.setJPEGEncodeParam(param);
 encoder.encode(bi);
}


private void initJPEG(File jpegFile) throws FileNotFoundException, IOException,
  IOException {
FileInputStream inputStream = new FileInputStream(jpegFile);
try {
  JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(inputStream);
  buffImage = decoder.decodeAsBufferedImage();
}
.....error handling.....

}

War es hilfreich?

Lösung

Ich habe diesen Ansatz nicht versucht, aber Sie können einen Blick auf Java Bild I / O-API . Die JPEGImageWriteParam Klasse würde von besonderem Interesse sein.

Andere Tipps

Ich hatte das gleiche Problem, Art of.I tat diese Tests zur Messung der Unterschiede bei der Codierung und Schreiben in Datei mit JpegCodec, ImageIO (ohne Parameter), ImageIO (mit Parametern).

    int numTest = 200;
    Robot robot = new Robot();
    BufferedImage image = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));

    //JPEGCODEC
    long t1 = System.currentTimeMillis();
    ByteArrayOutputStream ba = new ByteArrayOutputStream();
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(ba);
    JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
    param.setQuality(0.75f, false);
    encoder.setJPEGEncodeParam(param);

    File f = new File("TestJPEGCODEC");
    f.mkdir();
    for (int i = 0; i < numTest; i++) {
        encoder.encode(image);
        f = new File("TestJPEGCODEC\\test" + i + ".jpg");
        FileOutputStream fo = new FileOutputStream(f);
        fo.write(ba.toByteArray());
        fo.flush();
        ba.reset();

    }
    long t2 = System.currentTimeMillis();
    System.out.println("JPEGCODEC");
    System.out.println("Total time:: " + (t2 - t1) + " average time:: " + (t2 - t1) / numTest);

    //NORMAL IMAGEIO
    t1 = System.currentTimeMillis();
    f = new File("TestImageIO");
    f.mkdir();
    for (int i = 0; i < numTest; i++) {
        f = new File("TestImageIO\\test" + i + ".jpg");
        ImageIO.write(image, "jpg", f);
    }
    t2 = System.currentTimeMillis();
    System.out.println("ImageIO");
    System.out.println("Total time:: " + (t2 - t1) + " average time:: " + (t2 - t1) / numTest);

    Iterator<ImageWriter> it = ImageIO.getImageWritersByFormatName("jpg");
    ImageWriter writer = null;
    while (it.hasNext()) {
        writer = it.next();
    }
    //IMAGEIO EXPLICIT MODE
    t1 = System.currentTimeMillis();
    ImageWriteParam par = writer.getDefaultWriteParam();
    par.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    par.setCompressionQuality(0.75f);

    f = new File("TestImageIOExplicity");
    f.mkdir();
    for (int i = 0; i < numTest; i++) {
        f = new File("TestImageIOExplicity\\test" + i + ".jpg");
        FileImageOutputStream output = new FileImageOutputStream(f);
        writer.setOutput(output);
        IIOImage img = new IIOImage(image, null, null);
        writer.write(null, img, par);
        output.close();
    }

    t2 = System.currentTimeMillis();
    writer.dispose();
    System.out.println("IMAGEIOPAR");
    System.out.println("Total time:: " + (t2 - t1) + " average time:: " + (t2 - t1) / numTest);

Für den Code über meinem Testergebnis sind unten in ms.

JPEGCODEC 
Total time:: 13750 average time:: 68
ImageIO
Total time:: 38906 average time:: 194
IMAGEIOPAR
Total time:: 43078 average time:: 215

Ich weiß, dass ich die com.sun.image.codec.jpeg.JPEGCodec verwenden should't, aber mit dieser Art von Ergebnissen, macht es die Verwendung von ImageIO für Codier- / Schreib jpg unbearable.In mein aktuelles Projekt ist der Unterschied in durchschnittlicher Codierung und Schreiben ist so groß, dass ich JPEGCODEC verwenden muß, oder eine andere externe Bibliothek für den gleichen Effekt verwendet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top