[英]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.