动画 GIF 中帧之间的读取延迟

med*_*loh 3 java metadata image image-processing animated-gif

你如何读取每帧之间的动画 GIF 的控制块?我对每帧之间的延迟感兴趣。我查看了 ImageReader 的 Javadoc,但没有看到任何内容。

这是我从动画 GIF 中读取所有帧的代码,我将如何增强它以读取有关嵌入在动画 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();
    }
Run Code Online (Sandbox Code Playgroud)

Sag*_*age 5

您必须"delayTime"从元数据节点中寻找属性。使用以下工作示例来理解:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 看起来它实际上在百分之一秒内。来自动画 GIF wiki:许多渲染程序将图块或图层解释为动画帧,并将它们按顺序显示为无休止的动画 [11],大多数 Web 浏览器会以 0.1 秒的延迟时间自动显示帧。 (2认同)