gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:16:10 24 4
gpt4 key购买 nike

您如何在每一帧之间读取动画 GIF 的控制 block ?我对每帧之间的延迟感兴趣。我查看了 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();
}

最佳答案

您必须从元数据节点中寻找“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);
}
}

关于java - 读取动画 GIF 中帧之间的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20077913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com