2016-10-11 8 views
-3

입력 JPEG 이미지의 PPI/DPI를 높이고 JPEG로 저장해야하는 Java 프로그램을 만들고 있습니다.jpeg 이미지 ppi 또는 dpi를 Java에서 늘리는 방법은 무엇입니까?

실용적인 사람이라면 누구에게 어떤 도움을 줄 수 있습니까?

+0

ppi/dpi는 단지 변환 요소 일뿐입니다. 이미지에 몇 개의 픽셀이 있는지는 바뀌지 않습니다 ... 1 dpi 또는 (무한대) dpi이든 200x200 jpeg는 200x200입니다. –

+0

파인트 병으로 쿼트를 얻을 수 없으며 파인트 포트에서 쿼트를 얻을 수 없습니다. 크기를 늘리고 보간을 사용할 수 있지만 누락 된 픽셀을 정확하게 재현 할 수있는 것은 없습니다. – EJP

답변

2

"jpeg"을 형식 이름으로 사용해야하고 JPEG 관련 메타 데이터로 작업하려면 setDPI 메서드를 구현해야한다는 점을 제외하면 this answer과 같이 사용할 수 있습니다.

public static final String DENSITY_UNITS_NO_UNITS = "00"; 
public static final String DENSITY_UNITS_PIXELS_PER_INCH = "01"; 
public static final String DENSITY_UNITS_PIXELS_PER_CM = "02"; 

private BufferedImage gridImage; 

private void saveGridImage(File output) throws IOException { 
    output.delete(); 

    final String formatName = "jpeg"; 

    for (Iterator<ImageWriter> iw = ImageIO.getImageWritersByFormatName(formatName); iw.hasNext();) { 
     ImageWriter writer = iw.next(); 
     ImageWriteParam writeParam = writer.getDefaultWriteParam(); 
     ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB); 
     IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam); 
     if (metadata.isReadOnly() || !metadata.isStandardMetadataFormatSupported()) { 
      continue; 
     } 

     setDPI(metadata); 

     final ImageOutputStream stream = ImageIO.createImageOutputStream(output); 
     try { 
      writer.setOutput(stream); 
      writer.write(metadata, new IIOImage(gridImage, null, metadata), writeParam); 
     } finally { 
      stream.close(); 
     } 
     break; 
    } 
} 

private static void setDPI(IIOMetadata metadata) throws IIOInvalidTreeException { 
    String metadataFormat = "javax_imageio_jpeg_image_1.0"; 
    IIOMetadataNode root = new IIOMetadataNode(metadataFormat); 
    IIOMetadataNode jpegVariety = new IIOMetadataNode("JPEGvariety"); 
    IIOMetadataNode markerSequence = new IIOMetadataNode("markerSequence"); 

    IIOMetadataNode app0JFIF = new IIOMetadataNode("app0JFIF"); 
    app0JFIF.setAttribute("majorVersion", "1"); 
    app0JFIF.setAttribute("minorVersion", "2"); 
    app0JFIF.setAttribute("thumbWidth", "0"); 
    app0JFIF.setAttribute("thumbHeight", "0"); 
    app0JFIF.setAttribute("resUnits", DENSITY_UNITS_PIXELS_PER_INCH); 
    app0JFIF.setAttribute("Xdensity", String.valueOf(300)); 
    app0JFIF.setAttribute("Ydensity", String.valueOf(300)); 

    root.appendChild(jpegVariety); 
    root.appendChild(markerSequence); 
    jpegVariety.appendChild(app0JFIF); 

    metadata.mergeTree(metadataFormat, root); 
} 

이 코드는 PPI를 300x300으로 설정하지만이 변수를 만들 수도 있습니다.