2009-08-31 12 views
4

У нас есть некоторый код, который использует этот старый встроенный пакет Sun для управления изображениями, по существу кодируя JPEG-файлы до определенного размера и качества после чтения/декодирования из входного потока. Примеры кода ниже. Я был бы признателен за пример замены лучшей практики, используя соответствующие java. * Или javax. * API.Правильная замена для использования внутреннего пакета com.sun.image.codec.jpeg для Sun?

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

}

ответ

1

У меня была такая же проблема, вроде. Я проверил это для измерения различий в кодировании и записи в файл с помощью JpegCodec, ImageIO (без параметров), ImageIO (с параметрами).

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

Для кода выше мой результат теста ниже в мс.

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

Я знаю, что я should't использовать com.sun.image.codec.jpeg.JPEGCodec, но с такого рода результатов, это делает использование ImageIO для кодирования/записи JPG unbearable.In мой текущий проект, разница в среднем кодировании и записи настолько велика, что я должен использовать JPEGCODEC или использовать другую внешнюю библиотеку для того же эффекта.

+0

Спасибо за ваш вклад, в моем случае разница в производительности не была фактором, учитывая объем/частоту обработки. – Peter