0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PNGファイルを集めてアニメーションGIFとして保存する

Posted at

表題のもの

  • 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で明るさを底上げしている

入力例
00_base_Mm3rd_thumb.png
64pad_2024-10-07T110040_thumb.png 64pad_2024-10-07T110043_thumb.png 64pad_2024-10-07T110113_thumb.png 64pad_2024-10-07T110218_thumb.png

出力例 ※(両手1-5-3-7ボイシング) C△7 Dm7 G7 (両手1-5-1-3) C
output_ani.gif

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)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?