Read delay between frames in animated GIF

给你一囗甜甜゛ 提交于 2019-12-07 17:23:15

问题


How do you read the animated GIF's control block between each frame? I'm interested in the delay between each frame. I've looked at the Javadoc for ImageReader and I'm not seeing anything.

Here's my code for reading all the frames from the animated GIF, how would I enhance it to read the metadata about each frame embedded in the animated GIF?

    List<BufferedImage> list = new ArrayList<BufferedImage>();
    try {
        ImageReader reader = ImageIO.getImageReadersBySuffix("gif").next();
        reader.setInput(ImageIO.createImageInputStream(urlImage.openStream()));
        int i = reader.getMinIndex();
        int numImages = reader.getNumImages(true);
        while (i < numImages)
        {
            list.add(reader.read(i++));
        }

        // do stuff with frames of image...

    } catch (Exception e) {
        e.printStackTrace();
    }

回答1:


You will have to seek out "delayTime" attribute from metadata node. Use the following working example to understand:

public class GiffTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        ImageReader reader = ImageIO.getImageReadersBySuffix("gif").next();
        reader.setInput(ImageIO.createImageInputStream(new FileInputStream("H:\\toonGif.gif")));
        int i = reader.getMinIndex();
        int numImages = reader.getNumImages(true);

        IIOMetadata imageMetaData =  reader.getImageMetadata(0);
        String metaFormatName = imageMetaData.getNativeMetadataFormatName();

    IIOMetadataNode root = (IIOMetadataNode)imageMetaData.getAsTree(metaFormatName);

    IIOMetadataNode graphicsControlExtensionNode = getNode(root, "GraphicControlExtension");

        System.out.println(graphicsControlExtensionNode.getAttribute("delayTime"));
    }

    private static IIOMetadataNode getNode(IIOMetadataNode rootNode, String nodeName) {
        int nNodes = rootNode.getLength();
        for (int i = 0; i < nNodes; i++) {
            if (rootNode.item(i).getNodeName().compareToIgnoreCase(nodeName)== 0) {
            return((IIOMetadataNode) rootNode.item(i));
            }
       }
        IIOMetadataNode node = new IIOMetadataNode(nodeName);
        rootNode.appendChild(node);
        return(node);
  }
}


来源:https://stackoverflow.com/questions/20077913/read-delay-between-frames-in-animated-gif

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!