繁体   English   中英

如何从动画GIF获取长度(及时)

[英]How to get length (in time) from an animated GIF

有没有办法找出单循环动画GIF需要多长时间才能完成?

那么,具体的排序取决于你用来操纵那些动画GIF的界面(我不知道在原生Java / AWT / Swing中有一个真正的光滑方式),但是基本的想法是计算(帧率*数字)的框架)。

如果您手动编写GIF操作工具,我建议您查看http://www.onicos.com/staff/iz/formats/gif.html

希望这至少有一点帮助。

更新:尝试实现ImageObserver接口。 查看该类中的ImageObserver.FRAMEBITS标志以检测帧更新。 http://docs.oracle.com/javase/6/docs/api/java/awt/image/ImageObserver.html

这仍然留下了gif有多少帧的问题。 您可能想尝试查看Image.getProperty()函数。 我在查找是否有“框架”属性的文档方面遇到了一些困难,但请看一看。

使用库Metadata-Extractor读取图像文件的元信息。 下面的代码片段可用于读取GIF文件中每个图像(帧)的GifControlDirectory。

/**
 * Get time length of GIF file in milliseconds.
 *
 * @return time length of gif in ms.
 */
public int getGifAnimatedTimeLength(String imagePath) {
    Metadata metadata = ImageMetadataReader.readMetadata(imagePath);
    List<GifControlDirectory> gifControlDirectories =
            (List<GifControlDirectory>) metadata.getDirectoriesOfType(GifControlDirectory.class);

    int timeLength = 0;
    if (gifControlDirectories.size() == 1) { // Do not read delay of static GIF files with single frame.
    } else if (gifControlDirectories.size() >= 1) {
        for (GifControlDirectory gifControlDirectory : gifControlDirectories) {
            try {
                if (gifControlDirectory.hasTagName(GifControlDirectory.TAG_DELAY)) {
                    timeLength += gifControlDirectory.getInt(GifControlDirectory.TAG_DELAY);
                }
            } catch (MetadataException e) {
                e.printStackTrace();
            }
        }
        // Unit of time is 10 milliseconds in GIF.
        timeLength *= 10;
    }
    return timeLength;
}

请注意,即使GIF文件有多个帧,很可能每个帧的延迟为0或没有TAG_DELAY元数据。 此外, 本文还详细介绍了各种平台如何使用延迟值的另一个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM