画像処理ライブラリ「ImageMagick」を使ってみる
目的
- 大量にある画像を縦長、横長に分類したい(ImageMagick)
前提
- ImagiMagick
- すぐ消すかもしれないのでポータブル版を使う
- すぐ消すかもしれないのでパスは通さない
- Git Bashが導入済みなので、これでUnixコマンドを使う
導入
- ダウンロードページから「ImageMagick-7.0.7-8-portable-Q16-x64.zip」をダウンロード
-
C:\library\ImageMagick
に展開 -
C:\Temp
でGit Bashを立ち上げる(右クリック→「Git Bash Here」) - 下記コマンドを実行し、画像の幅と高さを取得して表示してみる
↑ affine.png:304pixel x 85pixelの画像(ImageMagick付属の画像集より)
$ /c/library/ImageMagick/identify.exe -format "%w %h" /c/library/ImageMagick/images/affine.png
304 85
画像のサイズが取得できたので、導入成功
動作を確認しながら目的のシェルスクリプトを作成
$ cat definition
ROOT_PATH="/c/Temp/"
IDENTIFY="/c/library/ImageMagick/identify.exe"
TEMP_FOLDER="_temp"
HEIGHT="_hight-is-longer"
WIDTH="_width_is_longer"
$ cat testShell01.sh
#!/bin/bash
function isPicture(){
# 拡張子で画像かどうか判定
case ${FILE_EXTENSION} in
"jpg" ) TOF="true";;
"png" ) TOF="true";;
* ) TOF="false";;
esac
}
. ./definition
# _____picuturesの中のファイル一覧
ARRAY=$(ls ${ROOT_PATH}${TEMP_FOLDER}/)
if [ -n "${ARRAY}" ]; then
# 一枚ずつサイズを取得して縦横の長さを比較
for item in ${ARRAY[@]};do
FILE_EXTENSION=$(echo ${item} | sed 's/^.*\.\([^\.]*\)$/\1/')
isPicture
# 対象のファイルが画像かどうかの判定
if [ ${TOF} = "true" ] ; then
echo ${item}
tate=$(${IDENTIFY} -format "%h" ${ROOT_PATH}${TEMP_FOLDER}/"${item}")
yoko=$(${IDENTIFY} -format "%w" ${ROOT_PATH}${TEMP_FOLDER}/"${item}")
echo -ne "high:${tate} width:${yoko}\n"
# 縦長なら_hight-is-longerディレクトリへ
# 横長なら_width_is_longerディレクトリへファイルを移動させる
if [ ${tate} -ge ${yoko} ]; then
echo "Vertical picture"
mv -vvv ${ROOT_PATH}${TEMP_FOLDER}/"${item}" ${ROOT_PATH}${HEIGHT}/
else
echo "Horizontal picture"
mv -vvv ${ROOT_PATH}${TEMP_FOLDER}/"${item}" ${ROOT_PATH}${WIDTH}/
fi
echo -e "---\n"
else
echo "${item} is not picture"
fi
done
else
echo "No pictures"
fi
課題
-
自分が用意した作業対象の画像が空白を含んでいるせいで上手く動かなかった。
→ シェルスクリプト内でリネームしようとするも上手くいかず、やむなくそこだけバッチで処理 -
上の理由から、この作業もバッチ化すれば良い感じなのだけれど、それも思ったようにいかず