Python-压缩gif图片大小
使用PIL、imageio,将gif拆帧、压缩、合成。博主使用的是PyCharm工具。
1、安装imageio。File-->Settings-->Project: pro-->Project Interpreter-->点击 右上角的“+”搜索“imageio”安装。
2、提取gif每一帧并保存jpg格式,这里使用.convert('RGB')是因为frame.save不能保存png格式的图片,下同。
def getFrames(im):
    #非动画
    if False == im.is_animated :
        return
    index = 1
    for frame in ImageSequence.Iterator(im):
        frame = frame.convert('RGB')
        frame.save("g%d.jpg" % index)
        compressImg('g%d.jpg'% index)
        index = index + 1
    return index
3、压缩图片。
def compressImg(ImgName):
    im = Image.open(ImgName)
    im.convert('RGB')
    if max(im.size[0], im.size[1]) > 780:
        im.thumbnail((780, 780))
    im.save('f-'+ImgName, quality=50)
    return 'OK'
4、将之前拆开的jpg文件合成gif。
def compressGif(ind,dur):
    images = []
    for i in range(1, ind):
        images.append(imageio.imread('f-g%d.jpg' % i))
    imageio.mimsave('c001.gif', images, duration = dur)
5、计算帧之间的频率,获取到的是毫秒,duration是秒,所以除以1000。
def calDuration(im):
    return (im.info)['duration']/1000
6、移除图片。
def removeImg(ind):
    for i in range(1,ind):
        af = 'f-g' + str(i) + '.jpg'
        f = 'g' + str(i) + '.jpg'
        if os.path.exists(af):
            os.remove(af)
        if os.path.exists(f):
            os.remove(f)
调用函数的代码(主函数)
gif = Image.open("gav27.gif")   #读取文件
cnt = getFrames(gif)    #提取每一帧,保存为jpg格式,返回总帧数,此过程会生成许多jpg文件
duration = calDuration(gif) #计算帧之间的频率,间隔毫秒
compressGif(cnt, duration)  # 压缩jpg,合并jpg成gif
removeImg(cnt)  # 删除中间jpg文件
总体代码如下:
import imageio
import os
from PIL import Image, ImageSequence
import moviepy.editor as mpy
def getFrames(im):
    #非动画
    if False == im.is_animated :
        return
    index = 1
    for frame in ImageSequence.Iterator(im):
        frame = frame.convert('RGB')
        frame.save("g%d.jpg" % index)
        compressImg('g%d.jpg'% index)
        index = index + 1
    return index
def compressImg(ImgName):
    im = Image.open(ImgName)
    im.convert('RGB')
    if max(im.size[0], im.size[1]) > 780:
        im.thumbnail((780, 780))
    im.save('f-'+ImgName, quality=50)
    return 'OK'
def compressGif(ind,dur):
    images = []
    for i in range(1, ind):
        images.append(imageio.imread('f-g%d.jpg' % i))
    imageio.mimsave('c001.gif', images, duration = dur)
def calDuration(im):
    return (im.info)['duration']/1000
def removeImg(ind):
    for i in range(1,ind):
        af = 'f-g' + str(i) + '.jpg'
        f = 'g' + str(i) + '.jpg'
        if os.path.exists(af):
            os.remove(af)
        if os.path.exists(f):
            os.remove(f)
gif = Image.open("gav27.gif")   #读取文件
cnt = getFrames(gif)    #提取每一帧,保存为jpg格式,返回总帧数,此过程会生成许多jpg文件
duration = calDuration(gif) #计算帧之间的频率,间隔毫秒
compressGif(cnt, duration)  # 压缩jpg,合并jpg成gif
removeImg(cnt)  # 删除中间jpg文件
效果如下所示:

    转载请注明出处,欢迎讨论和交流!

                
            
        
浙公网安备 33010602011771号