JavaでGifアニメーション
public static BufferedImage buffer;
int width = 100;
int height = 12;
int MAX_PAGE = 12;
private void execute() {
Iterator it = ImageIO.getImageWritersByFormatName("gif");
ImageWriter iw = it.hasNext() ? (ImageWriter) it.next() : null;
File outfile = new File("R:/sample.gif");
try {
buffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
IIOMetadata meta = iw.getDefaultImageMetadata(ImageTypeSpecifier.createFromRenderedImage(buffer), null);
String format = meta.getNativeMetadataFormatName();
IIOMetadataNode root = (IIOMetadataNode)meta.getAsTree(format);
int count = 0;
byte[] data = {
0x01,
(byte)((count >> 0) & 0xFF),
(byte)((count >> 8) & 0xFF)
};
IIOMetadataNode list = new IIOMetadataNode("ApplicationExtensions");
IIOMetadataNode node = new IIOMetadataNode("ApplicationExtension");
node.setAttribute("applicationID", "NETSCAPE");
node.setAttribute("authenticationCode", "2.0");
node.setUserObject(data);
list.appendChild(node);
root.appendChild(list);node = new IIOMetadataNode("GraphicControlExtension");
node.setAttribute("disposalMethod", "none");
node.setAttribute("userInputFlag", "FALSE");
node.setAttribute("transparentColorFlag", "FALSE");
node.setAttribute("delayTime", "15");
node.setAttribute("transparentColorIndex", "0");
root.appendChild(node);
meta.setFromTree(format, root);
ImageOutputStream ios = ImageIO.createImageOutputStream(outfile);
iw.setOutput(ios);
iw.prepareWriteSequence(meta);
for (int i=0;i< MAX_PAGE; i++){
buffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = buffer.createGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, width, height);
g.setColor(Color.red);
Integer s = (int) (Math.random() * 100000000);
g.drawString(s.toString(), 0, 12);
iw.writeToSequence(new IIOImage(buffer, null, meta), null);
}
iw.endWriteSequence();
} catch (IOException ex) {
ex.printStackTrace();
}
}
正直ヘッダ部分についてはあまり分かっていません。
細かいことはともかく感じだけ掴めたらいいかな、と。