Startseite bisherige Projekte Tools/Snippets Bücherempfehlungen Publikationen Impressum Datenschutzerklärung

Java: DPI beim PNG-Export setzenNovember 2018

Nützlich, falls z.B. ein Bild für den XML-Datenstrom einer XDP-Datei bei fester Breite eine variable Höhe hat.
Anzeige und ändern der DPIs ist z.B. über IrfanView möglich, indem die Bildinformationen mit der Taste  i  angezeigt werden.

// Das Bild wird gleich Base64-kodiert. Einfachere Fälle als Übungsaufgabe...

public static String convertImageToBase64PngWithDPI(BufferedImage offImage, int dpi) throws IOException {

    final String formatName = "png";
    
    for (Iterator<ImageWriter> iw = ImageIO.getImageWritersByFormatName(formatName); iw.hasNext();) {
        ImageWriter writer = iw.next();
        ImageWriteParam writeParam = writer.getDefaultWriteParam();
        ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BUFFERED_IMAGE_TYPE);
        IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);
        if (metadata.isReadOnly() || !metadata.isStandardMetadataFormatSupported()) {
            continue;
        }
        setDPIinMetadata(metadata, dpi);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        final ImageOutputStream stream = ImageIO.createImageOutputStream(bos);
        try {
            writer.setOutput(stream);
            writer.write(metadata, new IIOImage(offImage, null, metadata), writeParam);
        } finally {
            stream.close();
        }
        return DatatypeConverter.printBase64Binary(bos.toByteArray());
    }
    return "";
}
// copied from here: https://stackoverflow.com/questions/321736/how-to-set-dpi-information-in-an-image
private static void setDPIinMetadata(IIOMetadata metadata, int dpi) throws IIOInvalidTreeException {
    // for PNG, it's dots per millimeter
    double dotsPerMilli = 1.0 * dpi / 10 / INCH_2_CM;
    IIOMetadataNode horiz = new IIOMetadataNode("HorizontalPixelSize");
    horiz.setAttribute("value", Double.toString(dotsPerMilli));
    IIOMetadataNode vert = new IIOMetadataNode("VerticalPixelSize");
    vert.setAttribute("value", Double.toString(dotsPerMilli));
    IIOMetadataNode dim = new IIOMetadataNode("Dimension");
    dim.appendChild(horiz);
    dim.appendChild(vert);
    IIOMetadataNode root = new IIOMetadataNode("javax_imageio_1.0");
    root.appendChild(dim);
    metadata.mergeTree("javax_imageio_1.0", root);
}
Impressum - Datenschutzerklärung