D&Dした画像を1つのムービーにまとめるツールを作る
いずれSHOTGUNネタに繋がりますが、今回はD&Dした画像(画像サイズバラバラ)を
ツールにD&Dしたら1つのムービーにしてくれるツールを作ります。
ついでにPythonとPILの使い方復習もかねて。
ツールの仕様としては、
1 複数の画像をDDして使うコマンドラインツール(拡張子は画像ならOK)
2 最終的には非圧縮の1FPSの画像にする
3 出力先はDesktop
こんな感じとします。
どこでこんなの使うんだよ っておもうかもしれませんが
SHOTGUNに複数枚のチェック用静止画をUPしたいときなんかに使います。
code:py
# -*- coding: utf-8 -*-
"""
ツールにD&Dされた複数の画像を1つのムービーにする。
※とりあえずの簡易版※
"""
from PIL import Image
import glob
import subprocess
import sys
import os
FFMPEG_PATH = "ffmpeg/ffmpeg.exe -r 1 -i {0} {1}"
DESKTOP_PATH = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Desktop"
TEMP_DIR = "D:/work_dir"
def add_margin(pil_img, top, right, bottom, left, color):
"""
マージンを追加する
# 参考 #
"""
width, height = pil_img.size
new_width = width + right + left
new_height = height + top + bottom
result = Image.new(pil_img.mode, (new_width, new_height), color)
result.paste(pil_img, (left, top))
return result
def change_image_size_margin(pil_img,size=(1280,800)):
"""
指定のサイズになるように右と下に余白を追加
"""
x,y = pil_img.size
return add_margin(pil_img, 0, add_R, add_U, 0, (0,0,0))
def get_maximum_size(img_list):
max_x = 0
max_y = 0
for img in img_list:
pl_img = Image.open(img)
return max_x,max_y
# 画像サイズ
def change_maximum_size(img_list,work_path):
buff_name = "movie_buff_name_{0}.png"
change_img_list = []
max_x,max_y = get_maximum_size(img_list)
for num,img in enumerate(img_list):
pl_img = Image.open(img)
result = change_image_size_margin(pl_img,(max_x,max_y))
save_file_path = work_path + "/" + buff_name.format(str(num+1).zfill(4))
result.save(save_file_path)
change_img_list.append(save_file_path)
avi_conbine(work_path + "/" + buff_name.format("%04d"), DESKTOP_PATH + "/2DMovieConbine_Output.avi")
for i in change_img_list:
os.remove(i)
def avi_conbine(img_ptn,export_path):
subprocess.call(FFMPEG_PATH.format(img_ptn,export_path))
if __name__ == '__main__':
change_maximum_size(sys.argv1:,TEMP_DIR) まず、今回はサイズが均一でない という条件が入るので
全画像のXとYの最大値を取得した後、いちどリサイズした画像をテンポラリなフォルダに保存してから
(ついでに拡張子の違いを吸収)
それをFFMPEGで結合します。
1FPSで作る理由は、SHOTGUNのプレビューページで見たときに、30fpsだと高速で流れてしまって見づらいから。
終わったらデスクトップに保存して終了になります。
あとはこれをEXEにすれば終了です。
SHOTGUNに複数ページのチェック画像をあげたい場合、これ以外にはPDFを上げるというという手もあります。
この場合、PDF1ページが1コマとして今回と同じようにアップは可能です。
ですが、PDF経由の場合アップされた画像の質が尋常じゃなく悪くなるので
個人的には、あらかじめ非圧縮AVIとして作成したのちアップするのがオススメです。
PDFならば、PDF→JPEGにバラす→AVIとするだけでかなり画質が向上します。
その場合、ダウンロードしたファイルがPDFじゃない!!!というので困る場合は
VersionEntityにアップロード用のFileFieldを追加して
元の画像をZip化かしたものだったりPDFをアップするのがオススメです。
参考