2009-08-31 3 views
4

이미지를 조작하기 위해 이전의 내부 Sun 패키지를 사용하는 코드가 있습니다. 입력 스트림에서 읽고/디코딩 한 후 JPEG를 특정 크기와 품질로 인코딩합니다. 아래 코드 예제. 적절한 java. * 또는 javax. * API를 사용하여 모범 사례 대체 사례에 감사드립니다.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..... 

} 나는이 방법을 시도하지 않은

답변

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

위의 코드는 내 결과 테스트가 ms입니다.

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

나는 내가 com.sun.image.codec.jpeg.JPEGCodec를 사용 should't 것을 알고 있지만, 결과 이런 종류의, 그것은 unbearable.In JPG를 작성/인코딩 ImageIO에서의 사용을 만들어 내 현재 프로젝트에서 평균 인코딩 및 쓰기의 차이가 너무 커서 JPEGCODEC을 사용해야하거나 동일한 효과를 위해 다른 외부 라이브러리를 사용해야합니다.

+0

입력 해 주셔서 감사합니다. 제 경우에는 성능 차이가 처리량/처리 빈도에 영향을 미치지 않았습니다. – Peter

관련 문제