J'ai eu le même problème, sorte de.J'ai fait ces tests, pour mesurer les différences de codage et d'écrire dans le fichier avec JpegCodec, ImageIO (sans paramètres), ImageIO (avec 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 sont 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 fait l'utilisation de ImageIO pour l'encodage/écriture jpg unbearable.In mon projet actuel la différence dans l'encodage moyen et l'écriture est si grande que je dois utiliser JPEGCODEC, ou utiliser une autre bibliothèque externe pour le même effet.
Merci pour votre contribution, dans mon cas, la différence de performance n'était pas un facteur compte tenu du volume/fréquence de traitement. – Peter