2013-06-11 4 views
0

이 코드가 원본 JPEG의 해상도를 변경하는 이유는 무엇입니까? JPEG 품질 설정이 다를 수 있기 때문에 파일 크기가 다른지 이해할 수 있지만 이미지의 크기를 조정하는 이유를 알 수 없습니다.이미지 해상도 변경 중 이미지 만 회전하려고합니다.

File newfile=new File(mydestinationfolder.concat(imagename)); 
Files.move(file.toPath(),newfile.toPath(), REPLACE_EXISTING); 
Rotation Orientation; 
if ((Orientation=Exif_data.get_Exif_Orientation(newfile)) != null) { 

    System.out.println(Orientation.toString()); 
    BufferedImage oldimage = ImageIO.read(newfile); 
    BufferedImage tmp = Scalr.rotate(oldimage, Orientation); 
    oldimage.flush(); 
    oldimage=tmp; 
    ImageIO.write(oldimage, "JPEG", newfile); 

} 
+0

이미지 크기가 변경되어 이미지가 회전 할 때 전체 그림이 계속 표시 될 수 있습니다. 즉, 이미지의 내용을 렌더링 할 수 있도록 너비와 높이를 45도 변경해야합니다. – MadProgrammer

+1

if 그것은 유용합니다 .. http : //stackoverflow.com/questions/4918482/rotating-bufferedimage-instances –

+0

@MadProgrammer 나는 Exif 오리엔테이션이 90deg의 배수가 될 수 있다고 생각합니다. 따라서 크기는 대칭 이동해야합니다. – haraldK

답변

1

그럼 왜 ImageIO.write()의 기본 설정이 해상도를 변경하는지 잘 모르겠습니다. JPEG 품질이 100 %로 설정된 사용자 정의 작성기를 정의하면 이미지 해상도가 그대로 유지됩니다.

참고 : 스트림이 열린 동안 파일이 잠겨 있기 때문에 마지막에 output.close()가 중요합니다. 은 JPEG 읽으면서

BufferedImage oldimage = ImageIO.read(newfile); 
BufferedImage tmp = Scalr.rotate(oldimage, Orientation); 
oldimage.flush(); 
oldimage=tmp; 
Iterator iter = ImageIO.getImageWritersByFormatName("jpeg"); 
ImageWriter writer = (ImageWriter)iter.next(); 
ImageWriteParam iwp = writer.getDefaultWriteParam(); 
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
float quality=1.0f; 
iwp.setCompressionQuality(quality); 

FileImageOutputStream output = new FileImageOutputStream(newfile); 
writer.setOutput(output); 

IIOImage image = new IIOImage(oldimage, null, null); 
writer.write(null, image, iwp); 
writer.dispose(); 
output.close(); 
+0

감사합니다. 이것은 com.sun. * 패키지 및 JPEGImageEncoder에서 벗어날 수 있도록 도와줍니다. – onebeartoe

1

늦은 대답을하지만, 어쨌든 ..

/ImageIO에서 항상 손실이 될 것입니다, 당신은 회전하고있는 모든, 당신은 한 번 봐 가지고 있어야 사용/쓰기 사이클을 조작 이 thread에서 언급 된대로 mediautil에서 LLJTran.

해당 패키지를 사용하면 무손실 JPEG 변환을 수행하는 JPEG 블록 압축의 특별한 기능을 활용할 수 있습니다.

원본 코드가 이미지 해상도를 변경하는 이유와 왜 제안 된 솔루션이 문제를 해결할 수 있는지 이해가되지 않습니다 ... 나에게 버그 인 것 같으며 오라클에보고해야합니다. 내가 아는 것은, JPEG 품질을 1.0 (100 %)으로 설정하는 것이 JPEG가 의도 한 것이 아니며, 품질이 향상되지 않는 거대한 파일을 생성 할 것이라는 것입니다 (품질에 저장하는 것보다 나쁠 수 있음). 입력이 이미 압축 된 JPEG 인 경우).

+0

감사합니다. 나는 mediautil을 찾을 것이다. 코드를 개선해야 할 때가 너무 늦지 않았습니다. 파일을 JPEG로 변환하면 품질이 떨어질 수 있다는 것을 이해할 수 있습니다. 나는 JPEG가 손실된다는 것을 알고 있으며, 이런 방식으로 회전하는 것이 손실이된다는 것을 깨달았어야합니다. – Codeguy007