2009-08-31 7 views
4

Nous avons du code qui utilise cet ancien paquet Sun interne pour manipuler les images, codant essentiellement les JPEG à une taille et une qualité spécifiques après lecture/décodage d'un flux d'entrée. Exemples de code ci-dessous. J'apprécierais un exemple de remplacement des meilleures pratiques en utilisant java. * Ou javax. * API.Remplacement correct de l'utilisation du package interne de Sun com.sun.image.codec.jpeg?

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

}

Répondre

1

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.

+0

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

Questions connexes