Я создаю java-программу, которая мне нужна для увеличения PPI/DPI изображения JP изображения и сохраните его как JPEG.Как увеличить jpeg изображение ppi или dpi в java?
Кто-нибудь может дать мне несколько хитов, если это выполнимо?
Я создаю java-программу, которая мне нужна для увеличения PPI/DPI изображения JP изображения и сохраните его как JPEG.Как увеличить jpeg изображение ppi или dpi в java?
Кто-нибудь может дать мне несколько хитов, если это выполнимо?
Вы можете сделать это как в 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, но вы можете захотеть сделать эту переменную.
ppi/dpi - всего лишь переводнойа коэффициент. он не меняет количество пикселей в изображении ... 200x200 jpeg - 200x200, независимо от того, имеет ли он dpi или (бесконечность) dpi. –
Вы не можете получить кварту в банкноты пинты, и вы не сможете получить кварт из пинтового банка. Вы можете увеличить размер и использовать интерполяцию, но ничто не сможет точно воссоздать недостающие пиксели. – EJP