2013-07-12 4 views
1

인터넷에서 몇 가지 솔루션을 찾고 있었지만 아직 내 문제에 대한 답변을 찾지 못했습니다.ImageIO 원래 크기로 저장

나는 내 PC에서 이미지 파일을 가져 오는 프로그램을 만들거나 작업했는데 Java Graphics을 사용하여 일부 텍스트/오브젝트/등을 추가하여 편집합니다. 그런 다음 Java ImageIO은 새로 수정 된 이미지를 저장합니다.

지금까지 나는 훌륭하게 할 수 있었지만 이미지 크기에 문제가있었습니다. 원본 이미지와 수정 된 이미지의 크기가 같지 않았습니다.

원본은 2x3 인치 이미지이며 2x3 인치라고 가정 된 수정 된 이미지는 슬프게도 8x14 인치입니다. 그래서 원래의 것보다 더 크게되었습니다.

여전히 '좋은 품질'을 갖춘 2x3 인치 이미지의 출력을 제공하는 솔루션/코드는 무엇입니까?

UPDATE :

그래서, 여기에 내가 사용하는 코드입니다.

public Picture(String filename) { 
    try { 
     File file = new File("originalpic.jpg"); 
     image = ImageIO.read(file); 
     width = image.getWidth(); 
    } 
    catch (IOException e) { 
     throw new RuntimeException("Could not open file: " + filename); 
    } 
} 

private void write(int id) { 
    try { 
     ImageIO.write(image, "jpg", new File("newpic.jpg")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

2 UPDATE :

는 지금 새로운 이미지의 문제가 무엇을 알고있다. Photoshop에서 확인해 보면 원래 이미지와 다른 이미지 해상도를 가지고 있습니다. 원본 이미지는 300 픽셀/인치이고 새 이미지는 72 픽셀/인치 해상도입니다.

Java를 사용하여 해상도를 어떻게 변경할 수 있습니까?

+0

질문은 일반적인 것이지만, 다른 DPI 설정이있는 형식으로 저장하는 것이 좋습니다. 몇 가지 코드를 게시하면 도움을 얻을 수 있습니다. –

+1

문제의 [SSCCE] (http://sscce.org/)를 게시하십시오. – mattbdean

+0

이상합니다. Graphics2D의 모든 변환은 역변환과 함께 반영되어야합니다. _ 모르겠지만 그게 유일한 설명 인 것 같습니다 ._ 클리핑이 필요합니까? –

답변

2

(JFIF 세그먼트의) 이미지 해상도를 설정하려면 JPEG의 경우 IIOMetatada을 사용할 수 있습니다. 의 라인을 따라

뭔가 :

public class MetadataTest { 
    public static void main(String[] args) throws IOException { 
     BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_3BYTE_BGR); 

     ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next(); 
     writer.setOutput(ImageIO.createImageOutputStream(new File("foo.jpg"))); 
     ImageWriteParam param = writer.getDefaultWriteParam(); 

     IIOMetadata metadata = writer.getDefaultImageMetadata(ImageTypeSpecifier.createFromRenderedImage(image), param); 
     IIOMetadataNode root = (IIOMetadataNode) metadata.getAsTree(metadata.getNativeMetadataFormatName()); 
     IIOMetadataNode jfif = (IIOMetadataNode) root.getElementsByTagName("app0JFIF").item(0); 

     jfif.setAttribute("resUnits", "1"); 
     jfif.setAttribute("Xdensity", "300"); 
     jfif.setAttribute("Ydensity", "300"); 

     metadata.mergeTree(metadata.getNativeMetadataFormatName(), root); 

     writer.write(null, new IIOImage(image, null, metadata), param); 
    } 
} 

참고 :이 코드를 그대로 사용하지만, 스트림 등 폐쇄, 반복, 오류 처리를 추가해서는 안 클러 예를 너무 많이.

메타 데이터 형식 및 제어 할 수있는 옵션에 대한 설명은 JPEG Image Metadata DTD을 참조하십시오.