使用python以任何顺序从imges制作GIF

时间:2016-01-29 11:16:49

标签: python animation python-imaging-library gif

我试图用ubuntu 12.04中的python语言编写一系列png格式图片的gif。我有一个文件,我的照片在里面。它们被命名为lip_shapes1.png到lip_shapes11.png。我也有一个列表中包含图像的名称,我想在这个序列中制作gif。列表如下所示:

list = [lip_shapes1.png, lip_shapes4.png , lip_shapes11.png, lip_shapes3.png]

但我的问题是我找到了这段代码:

import os
os.system('convert   -loop 0   lip_shapes*.gnp   anime.gif')

但它只按gnp名称的顺序生成gif,但我希望它按我想要的任何顺序排列。有可能吗?

如果有人可以帮助我,我真的很感激。

提前致谢

PS:我也想制作一部电影。我尝试了这个代码(形状是我的图像名称列表):

    s = Popen(['ffmpeg', '-f', 'image2', '-r', '24', '-i'] + shapes + ['-vcodec', 'mpeg4', '-y', 'movie.mp4'])
s.communicate()

但它在终端给了我这个并且不起作用:

  

ffmpeg程序仅用于脚本兼容性,将被删除   在将来的版本中。它已在Libav项目中弃用以允许   名为avconv的替换中不兼容的命令行语法改进   (有关详细信息,请参阅更改日志)请改用avconv。

     

输入#0,image2,来自' shz8.jpeg':     持续时间:00:00:00.04,开始:0.000000,比特率:N / A.       流#0.0:视频:mjpeg,yuvj420p,266x212 [PAR 1:1 DAR 133:106],24 tbr,24 tbn,24 tbc

shz8.jpeg是列表中的第一个名字。

感谢

3 个答案:

答案 0 :(得分:2)

如果您使用subprocess.call,则可以将文件名作为字符串列表传递。如果文件名包含引号或空格,这将避免可能出现的shell quotation issues

import subprocess
shapes = ['lip_shapes1.png', 'lip_shapes4.png' , 'lip_shapes11.png', 'lip_shapes3.png']
cmd = ['convert', '-loop0'] + shapes + ['anime.gif']
retcode = subprocess.call(cmd)
if not retval == 0:
    raise ValueError('Error {} executing command: {}'.format(retcode, cmd))    

答案 1 :(得分:1)

所以你有一个想要转换成gif作为python列表的图像列表。您可以对其进行排序或按您想要的任何顺序排列。例如

img_list = ['lip_shapes1.png', 'lip_shapes4.png' , 'lip_shapes11.png', 'lip_shapes3.png'] img_list.sort()

请注意,list不应用作变量名称,因为它是列表类型的名称。

然后您可以在调用os.system(convert ...)例如

时使用此列表

os.system('convert -loop 0 %s anime.gif' % ' '.join(img_list))

答案 2 :(得分:0)

您应该确保在这里处理一些事情,如果您想从文件夹中读取一系列png,我建议使用for循环来检查文件的结尾,即.png,.jpg等我写了一篇有关如何轻松实现此目的的博文(有关here的信息):

image_file_names = [],[]
for file_name in os.listdir(png_dir):
    if file_name.endswith('.png'):
        image_file_names.append(file_name)
        sorted_files = sorted(image_file_names, key=lambda y: int(y.split('_')[1]))

这会将所有“ .png”文件放入一个文件名向量。从那里,您可以使用以下命令循环浏览文件以自定义gif:

images = []
frame_length = 0.5 # seconds between frames
end_pause = 4 # seconds to stay on last frame
# loop through files, join them to image array, and write to GIF called 'test.gif'
for ii in range(0,len(sorted_files)):       
    file_path = os.path.join(png_dir, sorted_files[ii])
    if ii==len(sorted_files)-1:
        for jj in range(0,int(end_pause/frame_length)):
            images.append(imageio.imread(file_path))
    else:
        images.append(imageio.imread(file_path))
# the duration is the time spent on each image (1/duration is frame rate)
imageio.mimsave('test.gif', images,'GIF',duration=frame_length)

这是上述方法产生的示例:

GIF Example

https://engineersportal.com/blog/2018/7/27/how-to-make-a-gif-using-python-an-application-with-the-united-states-wind-turbine-database