2010-06-08 2 views
20

우리는 웹 사이트에 업로드 된 사진의 크기를 조정하기 위해 Java2D를 사용하고 있지만 문제는 발생합니다 (겉으로보기에는 오래된 것입니다 : cf : http://forums.sun.com/thread.jspa?threadID=5425569). ImageIO.read()에 이진 데이터가 들어있는 경우 특정 JPEG가 CMMException입니다. : JPEG 파일을 읽을 수있는 ImageIO 대신 Java가 100 % 있습니까?

java.awt.color.CMMException: Invalid image format 
at sun.awt.color.CMM.checkStatus(CMM.java:131) 
at sun.awt.color.ICC_Transform.<init>(ICC_Transform.java:89) 
at java.awt.image.ColorConvertOp.filter(ColorConvertOp.java:516) 
at com.sun.imageio.plugins.jpeg.JPEGImageReader.acceptPixels(JPEGImageReader.java:1114) 
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImage(Native Method) 
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1082) 
at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:897) 
at javax.imageio.ImageIO.read(ImageIO.java:1422) 
at javax.imageio.ImageIO.read(ImageIO.java:1326) 
    ... 

우리는 특정 카메라에서 찍은 사진으로 좁혀 (우리 ImageIO.read() 전화, 서블릿 코드 등이다 스택 추적의 나머지를 냈다), 그리고 그 트리거 사진을 선택 이 오류는 http://img214.imageshack.us/img214/5121/estacaosp.jpg입니다. OpenJDK가 설치된 테스트 머신은 Sun의 JVM (Linux 및 Mac의 경우 1.6.0_20에서 테스트 한 것)에서만 발생합니다. OpenJDK가 설치된 테스트 머신은 JPEG 판독기가 다르기 때문에 동일한 사진을 문제없이 읽을 수 있습니다.

아쉽게도 프로덕션 환경에서 JVM을 전환하거나 ImageMagick (http://www.imagemagick.org/)과 같은 기본 종속 솔루션을 사용할 수 없습니다.

내 질문은 : ImageIOs JPEG 대신에 링크 된 것과 같은 사진을 처리 할 수있는 판독기가 있습니까? 그렇지 않다면 사용할 수있는 100 % 순수 자바 사진 크기 조정 솔루션이 있습니까?

감사합니다.

+0

그런데 ImageIO가 (http://stackoverflow.com/questions/2408613/problem-reading-jpeg-image-using-imageio-readfile-file에 따라) CMYK 이미지를 처리하지 않는다는 것을 알고 있습니다.그러나 샘플 1은 RGB입니다 (맥 미리보기에 관한 한 누군가가 그것을 확인할 수 있다면 기쁜 일입니다) – chesterbr

+0

오라클/썬 버그 데이터베이스에서 버그를 열었습니다 : http://bugs.sun.com/bugdatabase /view_bug.do?bug_id=7064516 아직 수정에 관심이 있다면 투표하십시오. –

답변

11

한 가능성이 유용한 라이브러리 그럴 수 자바 고급 이미징 라이브러리 (JAI)

아주 조금 더 복잡 ImageIO에서를 사용하는 것보다 있지만 빠른 테스트에서 난 그냥이 한 실행 될 수있는이 라이브러리를 사용을 할 수 열고 디스플레이 당신이 링크 한 문제 이미지 파일.

public static void main(String[] args) { 
     RenderedImage image = JAI.create("fileload", "estacaosp.jpg"); 

     float scale=(float) 0.5; 

     ParameterBlock pb = new ParameterBlock(); 
     pb.addSource(image); 

     pb.add(scale); 
     pb.add(scale); 
     pb.add(1.0F); 
     pb.add(1.0F); 

     pb.add(new InterpolationNearest());// ;InterpolationBilinear()); 
     image = JAI.create("scale", pb); 

     // Create an instance of DisplayJAI. 
     DisplayJAI srcdj = new DisplayJAI(image); 

     JScrollPane srcScrollPaneImage = new JScrollPane(srcdj); 

// Use a label to display the image 
     JFrame frame = new JFrame(); 

     frame.getContentPane().add(srcScrollPaneImage, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

이 코드를 실행하면 이미지가 잘로드되는 것 같습니다. 나는 이것이 당신을 도움이되기를 바랍니다

String filename2 = new String ("tofile.jpg"); 
    String format = new String ("JPEG"); 
    RenderedOp op = JAI.create ("filestore", image, filename2, format); 

: 그 다음

그리고 파일을 저장하고자하는 경우 마지막으로 당신은 단지 호출 할 수 있습니다를 ParamaterBlock

를 사용하여 50 % 크기가 조절됩니다. 행운을 빌어 요.

+0

확실히 그렇습니다! "헤드리스 (headless)"설정에서 얼마나 잘 작동하는지 확인해야하지만, 우리가 해결할 수 있다고 생각합니다. 고맙습니다! – chesterbr

+1

개발자가이 솔루션을 구현했으며 매력적이었습니다. 다시 한 번 감사드립니다! – chesterbr

+1

죽은 링크, http://www.oracle.com/technetwork/java/current-142188.html 또는 현재의 내용으로 업데이트하십시오. – user1133275

7

나는 똑같은 문제에 직면했다. JAI를 구식으로 사용하기를 꺼려했지만 최단 해결책 인 것 같습니다.

public static BufferedImage read(InputStream is) throws IOException { 
    try { 
     // We try it with ImageIO 
     return ImageIO.read(ImageIO.createImageInputStream(is)); 
    } catch (CMMException ex) { 
     // If we failed... 
     // We reset the inputStream (start from the beginning) 
     is.reset(); 
     // And use JAI 
     return JAI.create("stream", SeekableStream.wrapInputStream(is, true)).getAsBufferedImage(); 
    } 
} 
8

이전 게시물,하지만 나중에 참조 :

이 코드는 태양의 ImageIO에서 (고속) 또는 JAI 사용하여이 문제가 발생하는 몇 가지 경우에를 사용하여, BufferedImage의에 InputStream를 변환

이 질문과 링크에서 영감을 얻어 필자는 이러한 종류의 "불량"ICC 색상 프로파일을 가진 JPEG 이미지를 지원하는 ImageIO 용 JPEGImageReader 플러그인을 작성했습니다. "문제"는 ICC 프로파일의 렌더링 의도가 Java와 호환되지 않습니다. ColorConvertOp). 그것은 평범한 Java이고 JAI를 필요로하지 않습니다.

소스 코드와 링크 된 이진 빌드는 GitHub의 TwelveMonkeys project에서 무료로 사용할 수 있습니다.

관련 문제