Storing DPI and Paper Size information in a JPEG with Java

前端 未结 4 1483
南笙
南笙 2021-01-13 03:13

I have the following code:

ImageIO.write(originalImage, OUTPUT_TYPE, resultOutput);

This is an invocation of the following javax.imag

4条回答
  •  情歌与酒
    2021-01-13 04:07

    I found this post for setting DPI on PNG Files. It pointed out that you should use 'metadata.mergeTree' to properly save your metadata.

    With that in mind, here is some working groovy code that takes a BMP file and creates a JPG file at arbitrary DPI:

    import java.awt.image.BufferedImage
    import java.io.File
    import java.util.Hashtable
    import java.util.Map
    import javax.imageio.*
    import javax.imageio.stream.*
    import javax.imageio.metadata.*
    import javax.imageio.plugins.jpeg.*
    import org.w3c.dom.*
    
    File sourceFile = new File("sample.bmp")
    File destinationFile = new File("sample.jpg")
    
    dpi = 100
    
    BufferedImage sourceImage = ImageIO.read(sourceFile)
    ImageWriter imageWriter = ImageIO.getImageWritersBySuffix("jpeg").next();
    ImageOutputStream ios = ImageIO.createImageOutputStream(destinationFile);
    imageWriter.setOutput(ios);
    def jpegParams = imageWriter.getDefaultWriteParam();
    
    IIOMetadata data = imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(sourceImage), jpegParams);
    Element tree = (Element)data.getAsTree("javax_imageio_jpeg_image_1.0");
    Element jfif = (Element)tree.getElementsByTagName("app0JFIF").item(0);
    jfif.setAttribute("Xdensity", Integer.toString(dpi));
    jfif.setAttribute("Ydensity", Integer.toString(dpi));
    jfif.setAttribute("resUnits", "1"); // density is dots per inch                 
    data.mergeTree("javax_imageio_jpeg_image_1.0",tree)
    
    // Write and clean up
    imageWriter.write(data, new IIOImage(sourceImage, null, data), jpegParams);
    ios.close();
    imageWriter.dispose();
    

    Worked fine for me in that OSX's Preview app and Gimp both reported that the resulting image was 100 DPI. As to Paper Size...I imagine this is directly determined by DPI? I couldn't find any JPEG property that would set that particular value.

提交回复
热议问题