合成gif动态图之前的帧还能看得到
先安利人民邮电出版社刚出的这本《零基础Python入门教程》:
原因无他,因为是我编的。拖的时间比较久,我正在做课后习题的答案,同时也看看有哪些东西过时了。基础知识部分配的视频B站上地址是:
https://space.bilibili.com/167183739/channel/collectiondetail?sid=1254933
或直接搜pythonabc找合集《零基础Python入门教程》
油管上可以搜"零基础python入门教程 PythonABC"。
昨天做第17章图片处理的魔杖wand课后习题:
5.用手机连续拍几张照片记录物体的移动,然后用程序合成动态图。
本来想用手机连拍我家猫来着,可我家那怂猫一如既往滴不听话,只好把教程里用的pig.gif拿来生成连续图片:
from wand.image import Image
import os
import shutil
# os.path.dirname(__file__)取出代码文件所在的文件夹
imgS = os.path.join(os.path.dirname(__file__), 'pig.gif')
# 建存放各帧图片的文件夹
objF = os.path.join(os.path.dirname(__file__), 'gifFrame')
if os.path.exists(objF):
shutil.rmtree(objF)
os.makedirs(objF)
with Image(filename=imgS) as img: # 生成指向GIF文件的图片对象。
for i in range(len(img.sequence)):
pageImg = Image(image=img.sequence[i]) # 取出各帧
pageImg.save(filename=os.path.join(objF, f'frame{i}.png'))
文件夹gifFrame里的图片们长这样:
以为把书上给的例子改吧改吧把这些连续图片合成gif图片就可以“next”了:
from wand.image import Image
import os
objF = os.path.join(os.path.dirname(__file__), 'gifFrame')
with Image() as gifObj: # gifObj图片对象作为容器接收各个帧。
for imgN in sorted(os.listdir(objF)):
img = os.path.join(objF, imgN)
with Image(filename=img) as frame: # 生成图片对象。
gifObj.sequence.append(frame)
# 将生成的图片对象添加进gifObj的序列帧里,成为动态图的帧。
frame.delay = 100
fname = os.path.join(os.path.dirname(__file__), 'pig.gif')
gifObj.save(filename=fname)
却不想,出来的动态图成这样了:
也就是说以前的帧都看得到。让chatgpt找原因,它一本正经地出馊主意,试了几个“点子”都不灵,只好一边跟它继续反映情况(调教)一边打开搜索引擎上搜,搜索引擎更糟,只搜到了一个案例,给出的解决方案还不行。最后还得是chatgpt,它“意识”到可能是因为组成各帧的图片是透明背景,提议取掉透明背景信息,换上白色背景:
frame.alpha_channel = 'remove'
frame.background_color = Color('WHITE')
问题解决!怎能不爱chatgpt!!
代码如下:
from wand.image import Image
from wand.color import Color
import os
objF = os.path.join(os.path.dirname(__file__), 'gifFrame')
with Image() as gifObj: # gifObj图片对象作为容器接收各个帧。
for imgN in sorted(os.listdir(objF)):
img = os.path.join(objF, imgN)
with Image(filename=img) as frame: # 生成图片对象。
frame.alpha_channel = 'remove'
frame.background_color = Color('WHITE')
gifObj.sequence.append(frame)
# 将生成的图片对象添加进gifObj的序列帧里,成为动态图的帧。
frame.delay = 100
fname = os.path.join(os.path.dirname(__file__), 'pig.gif')
gifObj.save(filename=fname)
合成的gif: