2012-06-06 2 views
5

또는 압축을 처리하는 데 사용할 수있는 더 나은 라이브러리가 있습니까?JPEG를 만들 때 Java의 ImageWriter에서 사용하는 압축 알고리즘을 변경할 수 있습니까?

내가 이미 이해 한 것으로 머리말을 붙이겠습니다. (1) JPEG이 손실됩니다 - 입력 파일과 동일하게 보이지 않습니다. (2) 아래의 코드 에서처럼 압축 품질 설정을 0.0에서 1.0 사이의 값으로 조정할 수 있습니다.

BufferedImage를 가져 와서 JPEG로 변환하고 Java ImageWriter의 .write() 메소드가 Photoshop "Save for Web"와 비교하여 JPEG 이미지에 대한 하위 파 결과를 생성하는 것을 예로 들겠습니다.

내 코드는 지금이 바로 같은 비트 같습니다

// img is a BufferedImage, here 
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next(); 
ImageWriteParam iwp = writer.getDefaultWriteParam(); 
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
iwp.setCompressionQuality(.75f); 

IIOImage image = new IIOImage(img, null, null); 
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); 
writer.setOutput(ImageIO.createImageOutputStream(byteArrayOut)); 
writer.write(null, image, iwp); 
writer.dispose(); 

압축 품질 설정으로 재생,하지만 심지어 그들이 무엇을만큼 좋은 보지 않는다 "1.0"설정에서 다른 품질의 출력을 생산 I JPEG를 만들 때 다른 도구를 사용할 수 있습니다.

나는 새로운 사용자이므로 아직 이미지를 게시 할 수 없습니다. here's a webpage that demos the differences. 바라건대 나는 비슷한 질문을하는 미래의 사용자를 위해 영구히 여기에 그들을 데려다 줄 수 있습니다.

분명히이 특정 이미지는 JPEG 압축의 가장 적합한 후보는 아닙니다 (PNG는 훨씬 작고 무손실 임). 그러나 압축 인공물을 더 쉽게 볼 수 있습니다. 실제 이미지는 주로 자연 사진입니다. 최소한 자바의 JPEG 압축 알고리즘과 품질에 대해 질문하는 것이 더 많습니다.

+0

지금 당장 본 사람에게는 샘플 링크가 완료되었습니다. – timehat

+0

더 나은 JPEG 압축을 표준 Java에 통합하는 것이 이상적입니다. 오픈 소스 클린 룸 구현 (GNU/Linux libjpeg?/특히 GNU Classpath)을 받아 Java로 포팅하십시오. 어쩌면 JUG에 대한 지원이있을 수도 있습니다. –

답변

5

"자바의 ImageWriter의에 .write() (포토샵에 비해 방법은 JPEG 이미지에 대한 하위 파 결과를"웹으로 저장 "예를 들어,)."

Java 이미지에서 생성 된 이미지 품질을 Photoshop과 같은 전문 이미지 소프트웨어와 비교하는 데는 여러 가지 이유가 있습니다.

어쨌든 이미지의 이슈에 대한 가장 큰 원인은 무엇입니까? 일반적으로 이미지를 JPEG로 저장하는 소프트웨어의 경우 압축 또는 품질로 매개 변수를 지정할 수 있습니다. 다른 하나. 이 매개 변수는 JPEG 손실에 가장 큰 영향을 미치는 양자화 프로세스에서 사용되는 양자화 테이블의 크기를 조정하는 데 사용됩니다. 다른 인코더는 이미지 품질 차이를 부분적으로 설명하는 다른 양자화 테이블을 사용할 수 있습니다.

그러나 양자화 프로세스 전에 실제로 발생하는 채도 서브 샘플링 (또는 다운 샘플링)이 압축 및 이미지 품질에 영향을 미치는 다른 요소가있을 수 있습니다. 크로마 서브 샘플링은 이미지의 색상 정보가 원본보다 낮은 해상도로 샘플링되는 프로세스입니다. 더 나은 설명을 위해 this 기사를 읽으십시오.

Calvin Hass는 JPEGSnoop이라는 우수한 JPEG 감쇠 도구를 제공하며 http://www.impulseadventure.com에서 다운로드 할 수 있습니다.

Component[1]: ID=0x01, Samp Fac=0x11 (Subsamp 1 x 1), Quant Tbl Sel=0x00 (Lum: Y) 
Component[2]: ID=0x02, Samp Fac=0x11 (Subsamp 1 x 1), Quant Tbl Sel=0x01 (Chrom: Cb) 
Component[3]: ID=0x03, Samp Fac=0x11 (Subsamp 1 x 1), Quant Tbl Sel=0x01 (Chrom: Cr) 

색상 구성 요소에서 수행에는 서브 샘플링이 없음을 의미 : 사용자가 제공 한 ps75.jpg 이미지에이 도구를 사용하여, 나는 크로마 서브 샘플링에 관한 다음과 같은 출력을 발견했다. 반면에, subsampling 부분은 100.jpg와 75 두 가지 모두입니다.JPG 동일하다 : subsamping 수단

Component[1]: ID=0x01, Samp Fac=0x22 (Subsamp 1 x 1), Quant Tbl Sel=0x00 (Lum: Y) 
Component[2]: ID=0x02, Samp Fac=0x11 (Subsamp 2 x 2), Quant Tbl Sel=0x01 (Chrom: Cb) 
Component[3]: ID=0x03, Samp Fac=0x11 (Subsamp 2 x 2), Quant Tbl Sel=0x01 (Chrom: Cr) 

는 두 개의 연속적인 픽셀의 평균하여 색성분 모두 수평 및 수직 방향에서 수행되었다.

원래 이미지가 스트립 및/또는 스퀘어로 구성되어 있고 이미 여기에서 볼 수있는 유물을 발견 한 경우 채도 서브 샘플링이 이미지 품질에 미치는 영향이 가장 두드러 질 것입니다.

그래서이 특수한 경우 IMO는 품질 계수 설정보다 채도 서브 샘플링에서 더 많은 문제가 있습니다. 어쩌면 나는 깊이 파고 들지 않았지만, imageio 또는 그 뒤에있는 샘플러 요소 (아마도 com.sun.imageio.plugins.jpeg.JPEGImageWriter)를 설정하는 방법을 찾을 수 없었습니다. 양자화 및 허프만 테이블을 ImageWriter에서 사용할 수 있습니다.

따라서 imageWriter 플러그인을 독자적으로 작성하거나 독립 실행 형으로 작성하지 않는 한 Java의 ImageWriter에서 사용되는 압축 알고리즘을 변경할 수는 없습니다. 그러나 JEPG 압축 알고리즘의 복잡성을 감안할 때이 두 가지 방법 모두 중요하지 않습니다. James R. Weeks가 작성한 Java JpegEncoder 구현을 따라 가기가 상대적으로 쉽습니다. 기본적으로 채도 서브 샘플링을 수행하지 않습니다. 이전에는 무료 였지만 웹을 검색하여 원본 버전을 찾을 수 있습니다.

또 다른 흥미로운 점은 JPEGSnoop의 출력물에서 포토샵으로 저장 한 75 % JPEG 이미지의 실제 품질 요소가 실제로 약 92 %로 표시된다는 것입니다. 그리고 그 질문에 대답 할 것이다 캘빈 하스의 웹 사이트에서 다음 인용 텍스트는 왜 귀하의 경우에는 서브 샘플링을 사용하지 포토샵 :

: 여담으로

, 포토샵 CS2는 저장 JPEG 품질 설정에 따라 다른 크로마 서브 샘플링 레벨을 사용주의

Photoshop Save As Quality 0-6 - 2x2 Chroma Subsampling Photoshop Save As Quality 7-12 - 1x1 No Chroma Subsampling Photoshop Save For Web Quality 0-50 - 2x2 Chroma Subsampling Photoshop Save For Web Quality 51-100 - 1x1 No Chroma Subsampling 

체크 아웃 this JPEG 이미지도 기록 할 수있는 Java 이미지 라이브러리.

+0

자세한 설명을 가져 주셔서 감사합니다. 이 경우 채도 서브 샘플링은 품질 설정보다 훨씬 중요 할 것입니다. 필자는 Photoshop에 내장 된 시스템을 정확하게 비교하지 못했지만 비교할만한 표준이 될 것이라고 생각했습니다. 포인터에 다시 한번 감사드립니다. – timehat