Wand处理图片(ImageMagick)

先安利人民邮电出版社刚出的这本《零基础Python入门教程》:

原因无他,因为是我编的Image。拖的时间比较久,我正在做课后习题的答案,同时也看看有哪些东西过时了。基础知识部分配的视频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: