70-200/2.8SSMを持って辻堂海浜公園へ




価格.comに使用例として「EXIFを残して縮小した画像」 をアップロードしたら意図しない回転が起きてしまった。 折角の縦位置のポートレートが横位置になってしまいました。 その原因は私の管理方法にあったようです。

縦位置で撮った写真は、縦位置で鑑賞したいものです。 だから私は縦位置で撮ったオリジナル画像を「ロスレス」としてRotaを使って90度回転させていました。 さらに、その回転させたオリジナル画像を元に、 1/4縮小画像、1/16縮小画像、1/256のサムネイル画像を生成させていました。 しかし、これはRotaはEXIFに格納されている回転方向(Orientation)はそのままにしていました。 当時、回転方向を記録するデジカメなんてなかったろうと思います。

一方、価格.comのアップローダは、私が回転していることを知らないで(知るはずがない) アップロードされた画像のEXIFに従って「親切心から」再び回転してしまうのでした。 今後、このカメラの使用例として価格.comにアップロードすると同じ問題が発生します。 これを回避するには、こちらの画像管理方法を変更する必要があります。

色々考えて、次のようにしました。

exiftoolを使うと、以下のように 「どのように時計回りに何度回転させれば正しい画像が得られるか」 の指示が格納されています。

$ exiftool -S -Orientation DSC01148.JPG
Orientation: Horizontal (normal)

$ exiftool -S -Orientation DSC01149.JPG
Orientation: Rotate 270 CW

$ exiftool -S -Orientation DSC01150.JPG
Orientation: Rotate 90 CW

$ exiftool -S -Orientation DSC01151.JPG
Orientation: Rotate 180

この出力を元に、空白を区切り文字として、3個目を取得すれば後の処理が簡単そうです。 90度単位の回転はnetpbmの中のpamflipが使えます。 90度単位の回転は、 pnmrotateではなくpamflipを使うべきとドキュメントにも記載ありました。 カレントディレクトリーの 元画像とそのEXIF情報から自動回転したサムネイル画像を生成するには、以下のプログラムでOKでした。

#!/bin/bash

for file in DSC*.JPG
do
ROTATE=`exiftool -S -Orientation $file | cut -d" " -f 3`

echo $file $ROTATE

if [ $ROTATE = "90" ]; then

    echo $file $ROTATE
    jpegtopnm $file | pnmscale 0.0625 | pamflip -r270 | pnmtojpeg -quality=98 > THM`echo $file | cut -c 4-`

elif [ $ROTATE = "270" ]; then

    echo $file $ROTATE
    jpegtopnm $file | pnmscale 0.0625 | pamflip -r90 | pnmtojpeg -quality=90 > THM`echo $file | cut -c 4-`

elif [ $ROTATE = "180" ]; then

    echo $file $ROTATE
    jpegtopnm $file | pnmscale 0.0625 | pamflip -r180 | pnmtojpeg -quality=98 > THM`echo $file | cut -c 4-`

else

    echo $file $ROTATE
    jpegtopnm $file | pnmscale 0.0625 | pnmtojpeg -quality=98 > THM`echo $file | cut -c 4-`

fi

done

もう過去の写真はオリジナルを回転してしまったので、 改めてプログラムのデバッグのため写真を撮りに出かけることにしました。 湘南東急の6Fの駐車場を経由して、辻堂海浜公園を目指して移動開始です。 この機会に、過去に作っていたプログラムを改良しました。 さあ、結果はいかがでしょうか?


ご感想をご投票ください。
非常に悪い, 悪い, 普通, 良い, 非常に良い



Last modified at 21:24:17 March/06, 2012