えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

フォルダ内の画像をまとめて〇〇したい(コピペ用備忘録)

 フォルダ内の画像を1枚に対して何かしら処理をするのはググればすぐに出てくるのに、まとめて何かすることについては、全く触れていない記事が多いと感じます。

 しかも、一概にループさせるといっても様々な記法があり、そこそこ文章を書かないといけないため、いちいち書くのも面倒です。

 私は、画像を縦512pixelを基準にしてサイズを揃えたいと思い、Python3とBashで同様の動作を行うスクリプトのテンプレートを作成しました。コマンドはffmpegを用いました。

 動作は インプット用フォルダからファイルパスを取得→アウトプット用フォルダに対して同名で処理後のファイルを配置 という流れです。

 コマンドライン引数は採用していません。一応絶対パスを取得しています。

実行環境

  • Ubuntu18.04 LTS

  • Python3.6

Ubuntu Bash実装

Ubuntuに標準実装されている機能を活用します。環境変数の設定やその呼び出しが頻繁に発生するならBashが有利かもしれません。

INPUT_FOLDER=test
OUTPUT_FOLDER=output
height=512

mkdir -p $OUTPUT_FOLDER

ABS_DIR=$(cd $(dirname $0); pwd)

files=`find $ABS_DIR/$INPUT_FOLDER -maxdepth 1 -type f`

for filename in $files; do
    #処理の内容↓
    ffmpeg -i $filename -vf scale=-2:$height $ABS_DIR/$OUTPUT_FOLDER/`basename $filename`
done

Python3実装

 Python3を用いた実装です。Shellと異なり、変数が扱いやすいです。また、他のOSでも扱いやすいです。

#! /usr/bin/python3
import glob
import os

folder_name = 'input/'
output_folder_name = 'output/'
height = 512

os.makedirs(output_folder_name,exist_ok=True)

for imgfile in sorted(glob.glob(os.path.abspath(folder_name)+'/*')):
    #処理の内容↓
    os.system('ffmpeg -i '+imgfile+' -vf scale=-2:'+str(height)+' '+os.path.abspath(output_folder_name)+'/'+os.path.basename(imgfile))

結構面倒な書き方をしたなー。私は必要だからいいんだけどさ‥