Pythonのclickでコマンドラインツールをつくってみる
はじめに
今までコマンドラインツールはargparse
を使用していたが、Click
なるものが便利っぽいので使ってみる。
基本構文
Click
は引数を追加したい関数の前でデコレーターを用いて指定する。
@click.command() @click.argument('arg') def main(arg): pass
仕様とソースコード
モザイク画像から徐々に鮮明化していくgifを画像ファイル(png, jpg)から作成する。
import matplotlib.pyplot as plt from matplotlib.animation import ArtistAnimation from matplotlib.animation import PillowWriter from PIL import Image import numpy as np import click import math @click.command() @click.argument('input_path') @click.argument('output_path') @click.option('--puretime', '-p' , type=int, default=450, help='Pure image display time:[msec]') @click.option('--noisetime', '-n', type=int, default=1500, help='noisy image display time unit:[msec]') @click.option('--level','-l' , type=int, default=100, help='Noise level') def main(input_path, output_path, puretime, noisetime, level): im = Image.open(input_path) im_arr = np.asarray(im, dtype='int32').copy() fig, ax = plt.subplots() artists = [] interval = math.gcd(puretime, noisetime) for _ in range(int(puretime/interval)): artists.append([ax.imshow(im_arr)]) for _ in range(int(noisetime/interval)): ax.axis("off") artists.append([ax.imshow(im_arr)]) im_arr += np.random.randint(-level, level, im_arr.shape) fig.tight_layout() ani = ArtistAnimation(fig, artists[::-1], interval=interval) ani.save(output_path, writer='PillowWriter') if __name__ == '__main__': main()
python .\imgnoise.py ".\hatena.jpg" ".\hatena.gif" -p 100 -n 3000 -l 255
入力画像 | 出力画像 |
---|---|
![]() |
![]() |