package cz.nkp.differ.compare.io; import cz.nkp.differ.exceptions.ImageDifferException; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.image.ImageObserver; import java.awt.image.ImageProducer; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.imageio.ImageIO; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; /** * * @author xrosecky */ @XmlAccessorType(XmlAccessType.FIELD) public class SerializableImage extends Image { private static final String IMAGE_FORMAT = "png"; @XmlAttribute(name="format") private String format; @XmlElement(name="data") private byte[] data; private transient Image image; public SerializableImage() { } public SerializableImage(Image image) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ImageIO.write(convert(image), IMAGE_FORMAT, bos); this.data = bos.toByteArray(); this.format = IMAGE_FORMAT; } public void check() { if (image == null) { if (data == null) { throw new NullPointerException("data"); } ByteArrayInputStream bis = new ByteArrayInputStream(data); try { this.image = ImageIO.read(bis); } catch (IOException ioe) { throw new RuntimeException("Can't read image", ioe); } } } @Override public Graphics getGraphics() { check(); return image.getGraphics(); } @Override public int getHeight(ImageObserver observer) { check(); return image.getHeight(observer); } @Override public Object getProperty(String name, ImageObserver observer) { check(); return image.getProperty(name, observer); } @Override public ImageProducer getSource() { check(); return image.getSource(); } @Override public int getWidth(ImageObserver observer) { check(); return image.getWidth(observer); } public BufferedImage getBufferedImage() { check(); return convert(this.image); } public static BufferedImage convert(Image image) { if (image instanceof BufferedImage) { return (BufferedImage) image; } BufferedImage result = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB); Graphics2D graphic = result.createGraphics(); graphic.drawImage(image, null, null); return result; } }