2011-09-19 3 views
4

서블릿 내에서 이미지를 읽고, 다시 크기를 조정하고, 저장하려고합니다.JPEG 읽기 : ImageIO.read()가 색 공간을 엉망으로 만듭니다.

BufferedImage image = ImageIO.read(file); 

BufferedImage after = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
AffineTransform at = AffineTransform.getScaleInstance(factor, factor); 
AffineTransformOp scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); 
after = scaleOp.filter(image, null); 

ImageIO.write(after, "JPG", file)); 

원본 파일은 일반 RGB-JPEG,하지만 난 열고 파일을 저장할 때 그것은 CMYK-JPEG로 온다 : 즉, 관련 코드입니다. 이미지를 재조정하지 않아도 이미지가 열리고 닫히는 경우에도 문제가 발생합니다.

PNG 또는 GIF를 열면 모든 것이 정상입니다. 아무도 여기서 무엇을 해야할지 알지 못합니까? 나는 ImageIO의 read-Method가 원래의 색 공간을 유지할 것으로 기대합니다.

jpeg를 읽는 또 다른 방법이 있다면?

의견을 보내 주셔서 감사합니다.

+2

당신은'만들 after' 및 그것을 'scaleOp.filter'로 덮어 씁니다. 이 올바른지? 따라서 'after'이미지는 RGB라고해도 될 수 있습니다. 'after'를 RGB로하고 싶다면 변환을하기 전에'after' *에'image'를 '그릴'필요가 있습니다. –

+1

그것은 좋은 힌트입니다 : 필터 메서드는 완전히 새로운 BufferedImage를 반환합니다. 이제 이미지가 읽힐 때 이미지가 "색칠"되지는 않지만 변환시 나타납니다. 'graphics.drawImage (image, scaleOp, 0, 0)'을 사용하여 원본 이미지를 대상 이미지에 그려 보았습니다. 이제 올바르게 변형됩니다. 당신의 도움을 주셔서 감사합니다! –

+1

다행입니다! qn을 닫을 수 있도록 답으로 추가하겠습니다. –

답변

4

after을 만든 다음 scaleOp.filter으로 덮어 씁니다. 이 올바른지? 그렇다면 after 이미지가 RGB가 아닐 수도 있습니다. after을 RGB로 지정하려면 변환을 수행하기 전에 afterimage을 '그리기'해야 할 수 있습니다.

1

동일한 문제가있어이 페이지를 발견했습니다.

올바른 형식으로 BufferedImage를 만들고 필터 호출에서 null 대신 After Image로 사용하는 방법을 제안했습니다. 그것은 실제로 문제를 해결했습니다.

1

ImageIO.read은 RBG 값이 화면이나 프린터와 같은 물리적 장치에 매핑되는 방식을 정의하는 포함 된 색상 프로파일을 포함하여 모든 포함 된 메타 데이터를 무시합니다.

메타 데이터를 별도로 읽고 ImageIO.write으로 전달할 수 있지만 이미지를 (기본) sRGB 색 공간으로 변환하고 메타 데이터를 무시하는 것이 더 쉽습니다. 메타 데이터를 잃는 괜찮다면

, AffineTransformOp.filter의 문서에서

after = scaleOp.filter(image, null); 

after = scaleOp.filter(image, after); 

교체 :

If the color models for the two images do not match, a color conversion into the destination color model is performed.

관련 문제