百科问答小站 logo
百科问答小站 font logo



为什么有的GIF图片只会播放一遍,而有的会重复播放? 第1页

  

user avatar   liu-ji-27-94 网友的相关建议: 
      

答主@王泰 已经说的很详细了。网上制作循环GIF图一般使用PS软件,我这里补充一段将不循环的GIF图转为循环的Python代码,对于程序员们更友好和便捷。

这个问题是有实际场景的:知乎目前的文章只允许插入1MB大小以内的GIF图,而大多数表情包之外的动图都超出了这个大小,这时就需要对GIF的尺寸进行裁剪,或者进行抽帧。在Mac自带的预览功能里可以直接完成这两个操作,但代价就是原本循环播放的GIF变得只动一次了。使用以下代码:

       from PIL import ImageSequence, Image import imageio, os   location = "/path/to/"  # 文件目录 gif_file = os.path.join(location, "origin.gif")  # 输入GIF文件名 out_file = os.path.join(location, "output.gif")  # 输出GIF文件名  # 这里如果想使用灰度图,可以使用`.convert("L")`代替,参考https://pillow-cn.readthedocs.io/zh_CN/latest/handbook/concepts.html#mode frames = [frame.copy().convert("RGBA") for frame in ImageSequence.Iterator(Image.open(gif_file))] imageio.mimsave(out_file, frames, 'GIF', duration=0.5)  # duration表示两帧之间播放的间隔时间,也可不设,使用默认     

再添加一些逻辑,可以将不循环的GIF图批量转为循环的。在GIF的保存时,不要使用网上流行的这种(可能会影响循环):

       frames[0].save("out.gif", save_all=True, append_images=frames[1:])     

另外,也可以针对知乎的这个1MB场景,配合以上代码,写一个自动的GIF压缩程序~


user avatar   wang_tai 网友的相关建议: 
      

我们现在说的GIF图片全称是Graphics Interchange Format,是一种256色的图片压缩(LZW协议)文档,主要用来存储动态图片。GIF图片有两种格式分布是1987年的GIF87a和1989年GIF89a版本。

其中GIF89a扩展了图形控制区块备注说明应用程序接口等四个区块,并提供了对透明色多帧动画的支持[1]。这也是我们现在最广为使用的协议。

GIF89a 设定部分属性如下图所示[2]

1995年Netscape 为了让GIF可以更好的支持动画和视频剪辑,GIF89a又增加了图像控制扩展功能(Graphics Control Extension (GCE)),每个frame的图片都可以添加GCE部分,用来描述frame之间的延迟时间和循环次数。[3]

上图中 31D行,定义的就是重复播放次数。

所以,如果你的GIF动画不循环播放,一种可能是GCE设置成了1就是只播放一次;第二种可能是你的GIF动画中没有GCE部分。要是GIF动画没有GCE,那就要看播放GIF动画的工具是怎么处理默认逻辑了,有可能只播放一次,也有可能循环播放。

参考

  1. ^ https://zh.wikipedia.org/wiki/GIF
  2. ^ https://en.wikipedia.org/wiki/GIF
  3. ^ https://medium.com/the-world-in-venn/is-the-gif-playing-when-no-one-looks-308b3d3e285c



  

相关话题

  携程为什么突然技术转型从 .NET 转 Java? 
  华为自研的「仓颉」编程语言,未来能取代java的地位吗? 
  Java bean 是个什么概念? 
  a += a *= a; 为什么在C++和Java算出了不同结果? 
  Java 有哪些好的设计? 
  为什么jvm不用协程实现 gc 呢? 
  Java 8接口有default method后是不是可以放弃抽象类了? 
  为什么微软.NET,C#在美国,英国等国外都非常流行,而在国内却逐渐没落? 
  为什么 Java/JDK 都快出 18 了,还有人用 1.8 呢? 
  两年嵌入式C语言编程经验,如果有机会做和 Android 相关的 C++、JAVA,还有 Javascript 脚本开发工作,转过去好吗? 

前一个讨论
如何去阅读并学习一些优秀的开源框架的源码?
下一个讨论
请大家看看我的现代诗怎么样?





© 2024-09-19 - tinynew.org. All Rights Reserved.
© 2024-09-19 - tinynew.org. 保留所有权利