// BoardPainterUtil.java package net.sf.gogui.boardpainter; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.Locale; import java.util.Map; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageTypeSpecifier; import javax.imageio.ImageWriter; import javax.imageio.metadata.IIOInvalidTreeException; import javax.imageio.metadata.IIOMetadata; import javax.imageio.metadata.IIOMetadataNode; import javax.imageio.stream.ImageOutputStream; /** Utility functions for users of class BoardPainter. */ public final class BoardPainterUtil { public static BufferedImage createImage(int width, int height) { return new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); } /** Use a painter to paint the board in a buffered image. The image can be written to a file with writeImage(). */ public static BufferedImage getImage(BoardPainter painter, ConstField[][] field, int width, int height) { BufferedImage image = createImage(width, height); Graphics2D graphics = image.createGraphics(); painter.draw(graphics, field, width, false); graphics.dispose(); return image; } /** Write an image in PNG format to a file. @param metaData Optional PNG meta data (or null) */ public static void writeImage(BufferedImage image, File file, Map<String,String> metaData) throws IOException { Iterator iter = ImageIO.getImageWritersBySuffix("png"); ImageWriter writer = (ImageWriter)iter.next(); IIOMetadata meta = null; if (metaData != null) { ImageTypeSpecifier specifier = new ImageTypeSpecifier(image); meta = writer.getDefaultImageMetadata(specifier, null); String formatName = "javax_imageio_1.0"; org.w3c.dom.Node node = meta.getAsTree(formatName); for (Map.Entry<String,String> entry : metaData.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); addMeta(node, key, value); } try { meta.mergeTree(formatName, node); } catch (IIOInvalidTreeException e) { assert false; return; } } ImageOutputStream ios = ImageIO.createImageOutputStream(file); writer.setOutput(ios); try { writer.write(null, new IIOImage(image, null, meta), null); } catch (IllegalStateException e) { // ImageWriter on Linux Java 1.5 throws an IllegalStateException // instead of an IOException, if it has no write permissions throw new IOException("Could not write to file " + file); } } /** Make constructor unavailable; class is for namespace only. */ private BoardPainterUtil() { } private static void addMeta(org.w3c.dom.Node node, String keyword, String value) { IIOMetadataNode text = new IIOMetadataNode("Text"); IIOMetadataNode textEntry = new IIOMetadataNode("TextEntry"); textEntry.setAttribute("value", value); textEntry.setAttribute("keyword", keyword); textEntry.setAttribute("encoding", Locale.getDefault().toString()); textEntry.setAttribute("language", "en"); textEntry.setAttribute("compression", "none"); text.appendChild(textEntry); node.appendChild(text); } }