前回のエントリーでImageMagickを使って、コマンドラインで画像サイズを取得する方法を紹介しました。
今回は得た情報を元に画像縮小するスクリプトを作成したいと思います。
- bashのコマンドの後に引数として画像のPATHと縮小サイズを指定
- 引数が2つ無かったらエラー
- 縮小画像を保存するPATHは指定されたPATHの一つしたの階層の"output"ディレクトリ
- 指定された画像のPATHがディレクトリとして存在しなかった場合はエラー
- outputディレクトリが無かったら作成
- 入力された情報を表示
- 指定されたPATH以下にある"*.jpg"ファイルをfind文を使って列挙し、for文でloopさせる
- ImageMagickのidentifyコマンドを使って、画像の縦横の幅を取得
- 画像が横方向に大きかったら、横幅が指定された画像サイズになるように縮小して"output"フォルダに出力
- 画像が縦方向に大きかったら、縦幅が指定された画像サイズになるように縮小して"output"フォルダに出力
- 縮小に利用するコマンドはImageMagickのconvert
#!/bin/bash
if [ -z "$1" -a -z "$2" ]; then echo "Error: prease input two argument. image_size_convert.sh <folder_path> <img max size>"; exit; fi
IMAGE_PATH=$1; IMAGE_SIZE=$2; OUTPUT_PATH="${IMAGE_PATH}/../output/";
if [ ! -d $1 ]; then echo "Error: your seting folder_path is not found."; exit; fi
if [ ! -d ${OUTPUT_PATH} ]; then mkdir -p ${OUTPUT_PATH}; fi
echo "Folder pathe : " ${IMAGE_PATH}; echo "Image Max Size : " ${IMAGE_SIZE}; echo "Output path : " ${OUTPUT_PATH};
for FILE in `find ${IMAGE_PATH} -name *.jpg` do (省略) done;
WIDTH=`identify -format "%w" ${FILE}`; HEIGHT=`identify -format "%h" ${FILE}`; BASENAME=`basename ${FILE}`;
if [ ${WIDTH} -lt ${HEIGHT} ]; then echo "H : " ${WIDTH}" x " ${HEIGHT}; RESIZE="x${IMAGE_SIZE}"; else echo "W : " ${WIDTH} " x " ${HEIGHT}; RESIZE="${IMAGE_SIZE}x"; fi
convert -define jpeg:size=${WIDTH}x${HEIGHT} -resize ${RESIZE} -unsharp 2x1.4+0.5+0 -quality 100 -verbose ${FILE} ${OUTPUT_PATH}/${BASENAME};
全体的なコードは以下のようになります。
#!/bin/bash if [ -z "$1" -a -z "$2" ]; then echo "Error: prease input two argument. image_size_convert.sh <folder_path> <image max size>"; exit; fi IMAGE_PATH=$1; IMAGE_SIZE=$2; OUTPUT_PATH="${IMAGE_PATH}/../output/"; if [ ! -d $1 ]; then echo "Error: your seting folder_path is not found."; exit; fi if [ ! -d ${OUTPUT_PATH} ]; then mkdir -p ${OUTPUT_PATH}; fi echo "Folder pathe : " ${IMAGE_PATH}; echo "Image Max Size : " ${IMAGE_SIZE}; echo "Output path : " ${OUTPUT_PATH}; for FILE in `find ${IMAGE_PATH} -name *.jpg` do WIDTH=`identify -format "%w" ${FILE}`; HEIGHT=`identify -format "%h" ${FILE}`; BASENAME=`basename ${FILE}`; THMB=`echo ${BASENAME} | sed 's/_main/_thmb/'`; if [ ${WIDTH} -lt ${HEIGHT} ]; then echo "H : " ${WIDTH} " x " ${HEIGHT}; RESIZE="x${IMAGE_SIZE}"; else echo "W : " ${WIDTH} " x " ${HEIGHT}; RESIZE="${IMAGE_SIZE}x"; fi convert -define jpeg:size=${WIDTH}x${HEIGHT} -resize ${RESIZE} -unsharp 2x1.4+0.5+0 -quality 100 -verbose ${FILE} ${OUTPUT_PATH}/${BASENAME}; done