努金网(nujin.com)

 找回密码
 立即注册

微信登录,快人一步

查看: 53|回复: 0

[技术精华]使用PIL、imageio,将gif拆帧、压缩、合成。博主使用的是PyCharm ...技术精华

[复制链接]

223

主题

223

帖子

25

积分

穷困潦岛

Rank: 1

积分
25
发表于 2020-10-13 16:17:16 | 显示全部楼层 |阅读模式

使用PIL、imageio,将gif拆帧、压缩、合成。博主使用的是PyCharm工具。

1、安装imageio。File-->Settings-->roject:pro-->roject Interpreter-->点击 右上角的“+”搜索“imageio”安装。

  1. <font size="3">def getFrames(im):
  2.     #非动画
  3.     if False == im.is_animated :
  4.         return;
  5.     index = 1
  6.     for frame in ImageSequence.Iterator(im):
  7.         frame = frame.convert('RGB')

  8.         frame.save("g%d.jpg" % index)
  9.         compressImg('g%d.jpg'% index)
  10.         index = index + 1
  11.     return index</font>
复制代码


2、提取gif每一帧并保存jpg格式,这里使用.convert('RGB')是因为frame.save不能保存png格式的图片,下同。

  1. <font size="3">
  2. def compressImg(ImgName):
  3.     im = Image.open(ImgName)
  4.     im.convert('RGB')
  5.     if max(im.size[0], im.size[1]) > 128:
  6.         im.thumbnail((128, 128))

  7.     im.save('f-'+ImgName, quality=50)
  8. </font>
复制代码


3、压缩图片。


4、将之前拆开的jpg文件合成gif。

  1. <font size="3">def compressGif(ind,dur):
  2.     images = []
  3.     for i in range(1, ind):
  4.         images.append(imageio.imread('f-g%d.jpg' % i))
  5.     imageio.mimsave('c001.gif', images, duration = dur)</font>
复制代码


5、计算帧之间的频率,获取到的是毫秒,duration是秒,所以除以1000。

  1. <ol class="hljs-ln" style="box-sizing: border-box; outline: 0px; list-style: none; border-collapse: collapse; overflow: hidden; color: rgb(56, 58, 66); font-family: &quot;Source Code Pro&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Ubuntu Mono&quot;, &quot;Anonymous Pro&quot;, &quot;Droid Sans Mono&quot;, Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, sans-serif; white-space: pre;"><li style="box-sizing: border-box; outline: 0px; margin-left: 0px; list-style: none; height: 22px;"><div class="hljs-ln-code" style="box-sizing: border-box; outline: 0px; margin-left: 8px; float: left; height: 22px;"><div class="hljs-ln-line" style="box-sizing: border-box; outline: 0px;"><span class="hljs-function" style="box-sizing: border-box; outline: 0px;"><font size="3"><span class="hljs-keyword" style="box-sizing: border-box; outline: 0px; color: rgb(166, 38, 164);">def</span> <span class="hljs-title" style="box-sizing: border-box; outline: 0px; color: rgb(64, 120, 242);">calDuration</span>(<span class="hljs-params" style="box-sizing: border-box; outline: 0px;">im</span>):</font></span></div></div></li><li style="box-sizing: border-box; outline: 0px; margin-left: 0px; list-style: none; height: 22px;"><div class="hljs-ln-numbers" style="box-sizing: border-box; outline: 0px; float: left; height: 22px; width: 24px; border-right: 1px solid rgb(197, 197, 197);"><div class="hljs-ln-line hljs-ln-n" data-line-number="2" style="box-sizing: border-box; outline: 0px; padding-right: 8px; text-align: right; overflow-wrap: normal;"></div></div><div class="hljs-ln-code" style="box-sizing: border-box; outline: 0px; margin-left: 8px; float: left; height: 22px;"><div class="hljs-ln-line" style="box-sizing: border-box; outline: 0px;"><font size="3">    <span class="hljs-keyword" style="box-sizing: border-box; outline: 0px; color: rgb(166, 38, 164);">return</span> (im.info)[<span class="hljs-string" style="box-sizing: border-box; outline: 0px; color: rgb(80, 161, 79);">'duration'</span>]/<span class="hljs-number" style="box-sizing: border-box; outline: 0px; color: rgb(152, 104, 1);">1000</span></font></div></div></li></ol>
复制代码
6移除图片
  1. <font size="3">def removeImg(ind):
  2.     for i in range(1,ind):
  3.         af = 'f-g' + str(i) + '.jpg'
  4.         f = 'g' + str(i) + '.jpg'
  5.         if os.path.exists(af):
  6.             os.remove(af)
  7.         if os.path.exists(f):
  8.             os.remove(f)</font>
复制代码

7、压缩之前的图 20180302150756601

8、压缩之后的图片 2018030215093092



回复

使用道具 举报

 
在线客服
点击这里给我发消息
售前咨询热线
微信:gwailee
QQ:395508196

微信扫一扫,私享最新原创实用干货

QQ|Archiver|手机版|小黑屋|搜索管理|游戏管理|努金网(nujin.com) ( 沪ICP备20013403号 )

GMT+8, 2020-10-30 07:35 , Processed in 0.917355 second(s), 56 queries .

Powered by Nujin X3.4

© 2001-2017 Nujin Inc.

快速回复 返回顶部 返回列表