表題のもの
- Windowsでバッチファイルとして使う想定
- 同じフォルダに名前が64padで始まるpngファイルを置いて実行する
- もしくはSendToやD&Dからコマンドライン引数でファイルを与えて実行する
- ファイル名の順番に合成する
- PILを使用
- FFmpegでやろうと思ったら意外に面倒だった
- 64パッドのレイアウト図示用MIDIモニタで保存した画像ファイルの処理用
png_to_anigif.cmd.py
@python -x "%~f0" %* & pause & exit /b
# vim: set ft=python :
from pathlib import Path
import sys
from PIL import Image
OUTPUT_PATH = "output_ani.gif"
DURATION_MS = 800
PNG_PATTERN = "64pad*.png"
png_list = [Path(png) for png in sys.argv[1:]]
if len(png_list) == 0:
png_list = [png for png in Path(".").glob(PNG_PATTERN)]
png_list = sorted(png_list)
for png in png_list:
print(png)
im_list = [Image.open(path) for path in png_list]
print(f"output: {OUTPUT_PATH}")
im_list[0].save(OUTPUT_PATH, duration=DURATION_MS, loop=0,
save_all=True, append_images=im_list[1:], optimize=True)
乗算して保存するバージョン
- 注目するところを明るく、そうでないところを暗くしたい用
- 1枚目をベースに乗算したものをアニメーションGIFとして保存する
- ファイル名順なので
00_base_Mm3rd.png
等にしておけば1枚目になる
- ファイル名順なので
- ImageEnhancerで明るさを底上げしている
出力例 ※(両手1-5-3-7ボイシング) C△7 Dm7 G7 (両手1-5-1-3) C
png_to_anigif_BaseMul.cmd.py
@python -x "%~f0" %* & pause & exit /b
# vim: set ft=python :
from pathlib import Path
import sys
from PIL import Image, ImageChops, ImageEnhance
OUTPUT_PATH = "output_ani.gif"
DURATION_MS = 800
PNG_PATTERN = "64pad*.png"
LIGHT_FACTOR = 1.5
png_list = [Path(png) for png in sys.argv[1:]]
if len(png_list) == 0:
png_list = [png for png in Path(".").glob(PNG_PATTERN)]
png_list = sorted(png_list)
im_list = [Image.open(path) for path in png_list]
im_base = im_list[0]
im_rest = im_list[1:]
print(f"output: {OUTPUT_PATH}")
print(f"base: {im_base.filename}")
def proc_image(im, im_base):
print(f"multiply: {im.filename}")
im_temp = ImageChops.multiply(im_base, im)
return ImageEnhance.Brightness(im_temp).enhance(LIGHT_FACTOR)
im_result = [proc_image(im, im_base) for im in im_rest]
im_result[0].save(OUTPUT_PATH, duration=DURATION_MS, loop=0,
save_all=True, append_images=im_result[1:], optimize=True)