2013-09-01 2 views
1

JPG 이미지 파일을 가지고 있는데, BufferedImage에로드하고 나중에 BufferedImage를 JPG 파일에 다시 쓰려고합니다. 여기 내가 현재하고있는 일이있다.품질을 유지하면서 JPG 이미지를 읽고/쓰는 가장 빠른 방법은 무엇입니까?

품질을 떨어 뜨리지 않고 더 빨리 읽고 쓸 수있는 더 좋은 방법이 있습니까?

읽기 :

BufferedImage image = ImageIO.read(new File(storagePath + fileName + extension)); 

쓰기 :

BufferedImage image = // some jpg image   

Iterator iter = ImageIO.getImageWritersByFormatName("JPG"); 
if (iter.hasNext()) { 
    ImageWriter writer = (ImageWriter) iter.next(); 
    ImageWriteParam iwp = writer.getDefaultWriteParam(); 
    iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
    iwp.setCompressionQuality(quality); 

    File outFile = new File(storagePath + fileName + extension); 
    FileImageOutputStream output = new FileImageOutputStream(outFile); 
    writer.setOutput(output); 
    IIOImage iioImage = new IIOImage(image, null, null); 
    writer.write(null, iioImage, iwp); 
} 
+0

벤치 마크를 수행하지는 않았지만 PNG가 빠를 수도 있습니다. PNG는 항상 무손실입니다. –

+0

알아요.하지만 더 많은 기억이 필요합니다. 그리고 내 질문이 아니었다 –

+0

이것 좀보세요 : http://stackoverflow.com/questions/7982409/is-jpeg-lossless-when-quality-is-set-to-100 –

답변

1

당신은 원본 이미지를 수정하는 데 사용되는 동일한 양자화 테이블을 사용하여 JPEG를 다시 압축 품질의 손실을 최소화 할 수 있습니다. 반올림에서 단일 비트 오류를 ​​얻을 수도 있지만 꽤 가까워 질 수 있습니다.

문제는 어떻게 양자화 테이블을 얻는 지입니다. 인코딩 된 이미지를 지정하면 소스 이미지에서 값을 가져올 수 있습니다. 그렇지 않으면 이미지가 원래 동일한 인코더를 사용하여 인코딩되기를 바랍니다.

"품질 값"은 JPEG의 일부가 아닙니다. 이들은 몇몇 인코더에 의해 사용되는 양자화 테이블을 선택하는 방법이다. LIBJPEG은 가장 보편적 인 엔코더이지만 다른 것들이있는 다른 것들도 있습니다.

PNG 인코딩은 일반적으로 JPEG보다 느립니다.

관련 문제