计算化学公社

 找回密码 Forget password
 注册 Register
Views: 2618|回复 Reply: 2
打印 Print 上一主题 Last thread 下一主题 Next thread

[综合交流] 分享多帧bmp转gif动画和bmp转png的Python脚本

[复制链接 Copy URL]

1187

帖子

5

威望

2841

eV
积分
4129

Level 6 (一方通行)

跳转到指定楼层 Go to specific reply
楼主
本帖最后由 snljty 于 2022-2-17 16:43 编辑

这些功能用Linux下的convert命令等都能转换,但后者有些涉及图片大小变换等功能设置不合适的时候往往会很慢。VideoMach可以把多帧图片做成动画,但免费版有水印。另外ffmpeg也是一个选择,暂且不提。
两者分别需要imageio和pillow库,可以用pip install imageio pillow或者如果有conda,使用conda install imageio pillow也可以。注意没有管理员权限的时候要在管理员权限的cmd做(这两个脚本Linux下使用也没有问题)。

第一个脚本是将当前目录下所有的bmp文件按照文件名顺序制作成动画。
  1. #! /usr/bin/env python3
  2. # -*- Coding: UTF-8 -*-

  3. import imageio
  4. import os, sys
  5. import argparse

  6. parser = argparse.ArgumentParser(description = "Convert all bmp files to a gif animation.")

  7. parser.add_argument("--duration", type = float, default = 0.1, help = "Duration of each frame")
  8. parser.add_argument("--reverse", type = bool, default = False, help = "Whether reverse the animation or not")
  9. parser.add_argument("--loop", type = int, default = 1, help = "Loop how many times, 0 for infinite")
  10. parser.add_argument("--output", type = str, default = "out.gif", help = "Whether loop the animation or not")

  11. args = parser.parse_args()

  12. images = [imageio.imread(filename) for filename in sorted((fn for fn in os.listdir(".") if fn.endswith(".bmp")), reverse = args.reverse)]
  13. 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,用浏览器等即可查看。
bmp2gif_animate.py (916 Bytes, 下载次数 Times of downloads: 16)




另一个脚本是将当前目录下的部分或全部bmp格式图片转化为png格式。bmp通常是未压缩格式,诸如VMD结合Tachyon渲染出的图片,体积很大(尤其有成百上千图片的时候)。png是无损压缩格式,体积小得多。将此脚本保存成bmp2png.py,在有bmp文件的目录下配置好python环境,执行这个脚本,默认转换当前目录下的所有bmp文件,也可以命令行参数指定只转换哪些文件,比如python bmp2png.py 1.bmp 2.bmp只转换1.bmp和2.bmp。

转换完的文件名非拓展名部分和转换前相同,后缀变成png。

  1. #! /usr/bin/env python3
  2. # -*- Coding: UTF-8 -*-

  3. r"""
  4. Convert all or part of bmp files to png format in current directory.
  5. """

  6. import os
  7. import sys
  8. from PIL import Image

  9. fnlist = [_ for _ in os.listdir() if _.endswith('.bmp')] if (len(sys.argv) == 1) else sys.argv[1:].copy()
  10. for l in fnlist:
  11.     print('Procesing %s ...' % l)
  12.     im = Image.open(l)
  13.     im.save(os.path.splitext(l)[0] + '.png', 'png')
  14.     im.close()
复制代码


bmp2png.py (467 Bytes, 下载次数 Times of downloads: 11)

评分 Rate

参与人数
Participants 6
威望 +1 eV +18 收起 理由
Reason
ggdh + 5
wzkchem5 + 3
joeson + 2 GJ!
puzhongji + 3 实用
sobereva + 1
hdhxx123 + 5 好物!

查看全部评分 View all ratings

362

帖子

1

威望

4368

eV
积分
4750

Level 6 (一方通行)

2#
发表于 Post on 2022-1-2 07:26:10 | 只看该作者 Only view this author
好东西,一个小建议:楼主可以把需要调节的参数以变量的形式放在脚本的前几行,这样用起来比较方便。:D

1187

帖子

5

威望

2841

eV
积分
4129

Level 6 (一方通行)

3#
 楼主 Author| 发表于 Post on 2022-1-2 07:41:13 | 只看该作者 Only view this author
exity 发表于 2022-1-2 07:26
好东西,一个小建议:楼主可以把需要调节的参数以变量的形式放在脚本的前几行,这样用起来比较方便。:D

好的谢谢。第二个没有参数,文件名用命令行指定更方便还能Tab键补全文件名。第二个除了loop都放到除了导库以外的最前面了(导库除外,导库不放最前面有时候容易出问题,养成习惯了)。一开始没想到有这个参数,考虑的是另两个用命令行就能指定,只有一个小数和True/False,很容易区分。如果和loop都加上,不加关键词格式的命令行参数就没法识别是给哪个变量的,加了后就比较麻烦也增加记忆量...

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2024-11-23 16:18 , Processed in 0.209712 second(s), 27 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list