package edu.mbl.jif.imaging.meta; import java.io.*; import java.awt.*; import java.awt.image.*; import java.util.*; import javax.imageio.*; import javax.imageio.stream.*; import javax.imageio.metadata.*; import org.w3c.dom.Node; import org.w3c.dom.NamedNodeMap; public class MetadataCreator { public MetadataCreator () {} public static void main (String[] args) { try { // Create an image in memory and save it as Jpeg with metadata text. BufferedImage buffImg = new BufferedImage(50, 50, BufferedImage.TYPE_BYTE_GRAY); Graphics2D gc = buffImg.createGraphics(); gc.drawRect(20, 20, 10, 10); // create ImageWriter File outputFile = new File("out.jpg"); ImageWriter imgWriter = getImageWriterForMetadata(); ImageOutputStream ios = ImageIO.createImageOutputStream(outputFile); imgWriter.setOutput(ios); // Get the default metadata ImageTypeSpecifier imgTypeSpec = new ImageTypeSpecifier(buffImg); ImageWriteParam param = imgWriter.getDefaultWriteParam(); IIOMetadata meta = imgWriter.getDefaultImageMetadata(imgTypeSpec, param); IIOMetadataDisplay.displayIIOMetadata(meta); modifyMetadata(meta); // test System.out.println("Modified"); IIOMetadataDisplay.displayIIOMetadata(meta); // save it to file IIOImage image = new IIOImage(buffImg, null, meta); imgWriter.write(image); ios.close(); imgWriter.dispose(); // Now open the new image that we just saved ImageInputStream iis2 = ImageIO.createImageInputStream(outputFile); ImageReader imgReader2 = getImageReaderForMetadata(); imgReader2.setInput(iis2); // The following statement throws an IOException: JFIF APP0 must be // first marker after SOI IIOMetadata meta2 = imgReader2.getImageMetadata(0); } catch (IOException exc) { System.err.println("IOException: " + exc.getMessage()); } } static ImageReader getImageReaderForMetadata () { // Get a specific reader (we need one that supports the standard // metadata format). ImageReader imgReader = null; String useThisImageReader = "com.sun.imageio.plugins.jpeg.JPEGImageReader"; Iterator it = ImageIO.getImageReadersByFormatName("JPEG"); while (it.hasNext()) { imgReader = (ImageReader) it.next(); if (imgReader.getClass().getName().compareTo(useThisImageReader) == 0) { break; } else { imgReader = null; } } return (imgReader); } static ImageWriter getImageWriterForMetadata () { // Get a specific writer (we need one that supports the standard // metadata format). ImageWriter imgWriter = null; String useThisImageWriter = "com.sun.imageio.plugins.jpeg.JPEGImageWriter"; Iterator it = ImageIO.getImageWritersByFormatName("JPEG"); while (it.hasNext()) { imgWriter = (ImageWriter) it.next(); if (imgWriter.getClass().getName().compareTo(useThisImageWriter) == 0) { break; } else { imgWriter = null; } } return (imgWriter); } static void modifyMetadata (IIOMetadata meta) { if (meta != null) { IIOMetadataNode metadataRootNode = (IIOMetadataNode) meta.getAsTree("javax_imageio_1.0"); IIOMetadataNode textNode = new IIOMetadataNode("Text"); IIOMetadataNode textEntryNode = new IIOMetadataNode("TextEntry"); textEntryNode.setAttribute("value", "This is a test string"); textNode.appendChild(textEntryNode); metadataRootNode.appendChild(textNode); try { meta.setFromTree("javax_imageio_1.0", metadataRootNode); } catch (IIOInvalidTreeException exc) { System.out.println("Invalid tree exception"); exc.printStackTrace(); } } } }