我试图用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是列表中的第一个名字。
感谢
答案 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)
这是上述方法产生的示例: