2016-10-11 13 views
-3

Я создаю java-программу, которая мне нужна для увеличения PPI/DPI изображения JP изображения и сохраните его как JPEG.Как увеличить jpeg изображение ppi или dpi в java?

Кто-нибудь может дать мне несколько хитов, если это выполнимо?

+0

ppi/dpi - всего лишь переводнойа коэффициент. он не меняет количество пикселей в изображении ... 200x200 jpeg - 200x200, независимо от того, имеет ли он dpi или (бесконечность) dpi. –

+0

Вы не можете получить кварту в банкноты пинты, и вы не сможете получить кварт из пинтового банка. Вы можете увеличить размер и использовать интерполяцию, но ничто не сможет точно воссоздать недостающие пиксели. – EJP

ответ

2

Вы можете сделать это как в this answer, за исключением того, что вы должны использовать "jpeg" в качестве имени формата, и вам необходимо реализовать метод setDPI для работы с конкретными метаданными JPEG.

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, но вы можете захотеть сделать эту переменную.

Смежные вопросы