计算化学公社
标题:
分享多帧bmp转gif动画和bmp转png的Python脚本
[打印本页]
作者Author:
snljty
时间:
2021-12-31 09:20
标题:
分享多帧bmp转gif动画和bmp转png的Python脚本
本帖最后由 snljty 于 2022-2-17 16:43 编辑
这些功能用Linux下的convert命令等都能转换,但后者有些涉及图片大小变换等功能设置不合适的时候往往会很慢。VideoMach可以把多帧图片做成动画,但免费版有水印。另外ffmpeg也是一个选择,暂且不提。
两者分别需要imageio和pillow库,可以用pip install imageio pillow或者如果有conda,使用conda install imageio pillow也可以。注意没有管理员权限的时候要在管理员权限的cmd做(这两个脚本Linux下使用也没有问题)。
第一个脚本是将当前目录下所有的bmp文件按照文件名顺序制作成动画。
#! /usr/bin/env python3
# -*- Coding: UTF-8 -*-
import imageio
import os, sys
import argparse
parser = argparse.ArgumentParser(description = "Convert all bmp files to a gif animation.")
parser.add_argument("--duration", type = float, default = 0.1, help = "Duration of each frame")
parser.add_argument("--reverse", type = bool, default = False, help = "Whether reverse the animation or not")
parser.add_argument("--loop", type = int, default = 1, help = "Loop how many times, 0 for infinite")
parser.add_argument("--output", type = str, default = "out.gif", help = "Whether loop the animation or not")
args = parser.parse_args()
images = [imageio.imread(filename) for filename in sorted((fn for fn in os.listdir(".") if fn.endswith(".bmp")), reverse = args.reverse)]
imageio.mimsave(args.output if args.output.endswith(".gif") else ".".join([args.output, "gif"]), images, duration = args.duration, loop =args.loop)
复制代码
有几个参数,用诸如python bmp2gif_animation.py --help可以查看参数用法。具体是--duration指定每帧时长,--reverse指定是否反转动画,--loop指定是循环次数,0是无限循环。--output指定输出文件名。
gif格式动画默认会被输出为工作目录下的out.gif,用浏览器等即可查看。
(, 下载次数 Times of downloads: 16)
上传 Uploaded
点击下载Click to download
另一个脚本是将当前目录下的部分或全部bmp格式图片转化为png格式。bmp通常是未压缩格式,诸如VMD结合Tachyon渲染出的图片,体积很大(尤其有成百上千图片的时候)。png是无损压缩格式,体积小得多。将此脚本保存成bmp2png.py,在有bmp文件的目录下配置好python环境,执行这个脚本,默认转换当前目录下的所有bmp文件,也可以命令行参数指定只转换哪些文件,比如python bmp2png.py 1.bmp 2.bmp只转换1.bmp和2.bmp。
转换完的文件名非拓展名部分和转换前相同,后缀变成png。
#! /usr/bin/env python3
# -*- Coding: UTF-8 -*-
r"""
Convert all or part of bmp files to png format in current directory.
"""
import os
import sys
from PIL import Image
fnlist = [_ for _ in os.listdir() if _.endswith('.bmp')] if (len(sys.argv) == 1) else sys.argv[1:].copy()
for l in fnlist:
print('Procesing %s ...' % l)
im = Image.open(l)
im.save(os.path.splitext(l)[0] + '.png', 'png')
im.close()
复制代码
(, 下载次数 Times of downloads: 11)
上传 Uploaded
点击下载Click to download
作者Author:
exity
时间:
2022-1-2 07:26
好东西,一个小建议:楼主可以把需要调节的参数以变量的形式放在脚本的前几行,这样用起来比较方便。:D
作者Author:
snljty
时间:
2022-1-2 07:41
exity 发表于 2022-1-2 07:26
好东西,一个小建议:楼主可以把需要调节的参数以变量的形式放在脚本的前几行,这样用起来比较方便。:D
好的谢谢。第二个没有参数,文件名用命令行指定更方便还能Tab键补全文件名。第二个除了loop都放到除了导库以外的最前面了(导库除外,导库不放最前面有时候容易出问题,养成习惯了)。一开始没想到有这个参数,考虑的是另两个用命令行就能指定,只有一个小数和True/False,很容易区分。如果和loop都加上,不加关键词格式的命令行参数就没法识别是给哪个变量的,加了后就比较麻烦也增加记忆量...
欢迎光临 计算化学公社 (http://bbs.keinsci.com/)
Powered by Discuz! X3.3