ImageMagickを使ってコマンドラインで画像縮小をする - uehatsu's tech blog

前回のエントリーでImageMagickを使って、コマンドラインで画像サイズを取得する方法を紹介しました。

今回は得た情報を元に画像縮小するスクリプトを作成したいと思います。

まずは仕様ですが、以下のような形にします。

  1. bashのコマンドの後に引数として画像のPATHと縮小サイズを指定
  2. 引数が2つ無かったらエラー
  3. 縮小画像を保存するPATHは指定されたPATHの一つしたの階層の"output"ディレクトリ
  4. 指定された画像のPATHがディレクトリとして存在しなかった場合はエラー
  5. outputディレクトリが無かったら作成
  6. 入力された情報を表示
  7. 指定されたPATH以下にある"*.jpg"ファイルをfind文を使って列挙し、for文でloopさせる
  8. ImageMagickのidentifyコマンドを使って、画像の縦横の幅を取得
  9. 画像が横方向に大きかったら、横幅が指定された画像サイズになるように縮小して"output"フォルダに出力
  10. 画像が縦方向に大きかったら、縦幅が指定された画像サイズになるように縮小して"output"フォルダに出力
  11. 縮小に利用するコマンドはImageMagickのconvert
こんなところでしょうか。

では、実際にコードを書いていきます。

0. bashコマンドのおまじない

#!/bin/bash
1. bashのコマンドの後に引数として画像のPATHと縮小サイズを指定
2. 引数が2つ無かったらエラー

if [ -z "$1" -a -z "$2" ]; then
    echo "Error: prease input two argument. image_size_convert.sh <folder_path> <img max size>";
    exit;
fi
3. 縮小画像を保存するPATHは指定されたPATHの一つ下の階層の"output"ディレクトリ

IMAGE_PATH=$1;
IMAGE_SIZE=$2;
OUTPUT_PATH="${IMAGE_PATH}/../output/";
4. 指定された画像のPATHがディレクトリとして存在しなかった場合はエラー

if [ ! -d $1 ]; then
    echo "Error: your seting folder_path is not found.";
    exit;
fi
5. outputディレクトリが無かったら作成

if [ ! -d ${OUTPUT_PATH} ]; then
    mkdir -p ${OUTPUT_PATH};
fi
6. 入力された情報を表示

echo "Folder pathe : " ${IMAGE_PATH};
echo "Image Max Size : " ${IMAGE_SIZE};
echo "Output path : " ${OUTPUT_PATH};
7. 指定されたPATH以下にある"*.jpg"ファイルをfind文を使って列挙し、for文でloopさせる

for FILE in `find ${IMAGE_PATH} -name *.jpg`
do
(省略)
done;
8. ImageMagickのidentifyコマンドを使って、画像の縦横の幅を取得

WIDTH=`identify -format "%w" ${FILE}`;
HEIGHT=`identify -format "%h" ${FILE}`;
BASENAME=`basename ${FILE}`;
9. 画像が横方向に大きかったら、横幅が指定された画像サイズになるように縮小して"output"フォルダに出力
10. 画像が縦方向に大きかったら、縦幅が指定された画像サイズになるように縮小して"output"フォルダに出力

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
11. 縮小に利用するコマンドはImageMagickのconvert

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
 
カテゴリ

Who is uehatsu?

uehatsu

アーカイブ

Facebook page