ShellScript
ImageMagick

ImageMagickを使う(Windows編)

More than 1 year has passed since last update.

画像処理ライブラリ「ImageMagick」を使ってみる

参考:
ImageMagick (1) インストール編

目的

  • 大量にある画像を縦長、横長に分類したい(ImageMagick)

前提

  • ImagiMagick
    • すぐ消すかもしれないのでポータブル版を使う
    • すぐ消すかもしれないのでパスは通さない
    • Git Bashが導入済みなので、これでUnixコマンドを使う

導入

  1. ダウンロードページから「ImageMagick-7.0.7-8-portable-Q16-x64.zip」をダウンロード
  2. C:\library\ImageMagickに展開
  3. C:\TempでGit Bashを立ち上げる(右クリック→「Git Bash Here」)
  4. 下記コマンドを実行し、画像の幅と高さを取得して表示してみる

affine.png
↑ 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

課題

  • 自分が用意した作業対象の画像が空白を含んでいるせいで上手く動かなかった。
     → シェルスクリプト内でリネームしようとするも上手くいかず、やむなくそこだけバッチで処理

  • 上の理由から、この作業もバッチ化すれば良い感じなのだけれど、それも思ったようにいかず