remplacement approprié pour l'utilisation du paquet com.sun.image.codec.jpeg interne Sun?

voix
4

Nous avons un code coups de pied autour qui utilise ce vieux paquet Sun interne pour manipuler des images, essentiellement à coder JPEGs une taille spécifique et la qualité après avoir lu dans / décodage d'un flux entrant. Les exemples de code ci-dessous. Je vous serais reconnaissant un meilleur exemple de remplacement de la pratique en utilisant java approprié. * Ou javax. * API.

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.....

}

Créé 01/09/2009 à 00:44
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

Je ne l' ai pas essayé cette approche, mais vous pouvez jeter un oeil l' image Java API d' E / S . La classe JPEGImageWriteParam serait d' un intérêt particulier.

Créé 01/09/2009 à 01:27
source utilisateur

voix
1

J'ai eu le même problème, trier of.I fait ce tests pour mesurer les différences de codage et écrire dans le fichier avec JpegCodec, ImageIO (sans paramètres), ImageIO (avec des paramètres).

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

Pour le code ci-dessus mon test de résultat ci-dessous en ms.

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

Je sais que je should't utilise le com.sun.image.codec.jpeg.JPEGCodec, mais avec ce genre de résultats, il rend l'utilisation de ImageIO pour l'encodage / écriture jpg unbearable.In mon projet actuel la différence de codage moyenne et l'écriture est si grand que je dois utiliser JPEGCODEC, ou utiliser une autre bibliothèque externe pour le même effet.

Créé 18/05/2012 à 19:56
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more