ImageMagickによる一括処理について


特定のディレクトリ以下にある大量のjpgファイルをサムネイル化したいですが
うまくいきません。。(:o:)
画像は300ほどのサブディレクトリに別れて保存されています。

単純な縮小であれば以下のようなコマンドで変換できたのですが、
find . -name "*.jpg" -exec mogrify -quality 80 -thumbnail 100x100 {} \;

縦長、横長、サイズ等がバラバラな画像から、正方形のサムネイルを作成したいです。
短い方の辺の長さで長い方の辺を中心から正方形に切り抜きそれを縮小したいと思っています。

同じ内容の質問で
http://q.hatena.ne.jp/1232514757
こちらに回答があったのですが
getimagesize
などが、PHPでしか使えないようでうまくいきませんでした。

上記の内容を1行のコマンドもしくは以下のような形で呼び出せるシェルスクリプトにするには
find . -name "*.jpg" -exec ./resize.sh {} \;
どうすればよいでしょうか?

環境はCentOS5.6でコマンドラインでの接続は出来ますが、XWindowなどは使えません。

少し急いでおりますので1000ptを設定させて頂きました。
よろしくお願い致します。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/09/04 08:31:40
  • 終了:2011/09/04 17:13:52

ベストアンサー

id:mjy No.9

mjy回答回数67ベストアンサー獲得回数202011/09/04 12:00:01

ポイント250pt

シェルスクリプトの例も書いておきます。

resize.sh というファイル名で保存し、実行権限を与えれば、

上で書かれているように、

find . -name "*.jpg" -exec ./resize.sh {} \;

で動くはずです。

(ただこのサムネイルの作り方で本当によいのでしょうか。

細長い画像の場合、よく分からないサムネイルになりますよね)

#! /bin/sh

file=$1

eval $(identify -format 'width=%w; height=%h' $file)

if [ $width -lt $height ]; then
	size='100'
else
	size='x100'
fi

mogrify -thumbnail $size -gravity center -extent 100x100 $file
id:makkoch

ご丁寧にありがとうございます。

ImageMagicを最新版にしたところ教えていただい通りできました!

シェルスクリプトも勉強になりました。

この度はどうもありがとうございました。

2011/09/04 17:13:16

その他の回答(8件)

id:Slight_Bright No.1

Slight_Bright回答回数47ベストアンサー獲得回数22011/09/04 09:12:31

mogrifyのオプションを確認してませんが、一般に同じディレクトリにあるファイルに同じ操作をスクリプト処理するのであれば、以下の通り。

for i in *.jpg;do mogrify $i -quality 80 -thumbnail 100x100 {};done

一応こちらでも試してみますが。

id:aismaiku No.2

回答回数85ベストアンサー獲得回数102011/09/04 09:15:44

できるそうですが、やりかたが説明下手なんでちょっとよく分かりませんが、

YOUTUBEやYHOOOなどで調べてみてはいかがでしょうか?

id:Slight_Bright No.3

Slight_Bright回答回数47ベストアンサー獲得回数22011/09/04 09:23:12

確認しました。

for i in *.png;do mogrify -quality 80 -thumbnail 100x100 $i;done

で、842x595を100x71に一括処理できました。

id:makkoch

回答ありがとうございます。

せっかく試して頂いて申し訳ありませんが、

find . -name "*.jpg" -exec mogrify -quality 80 -thumbnail 100x100 {} \;

こちらを1行のコマンドにしたいのではなく

http://q.hatena.ne.jp/1232514757

こちらの質問の回答にある以下の部分を、getimagesizeなどのPHPの関数を使わずに

シェルスクリプトにしていただきたいと思っております。

よろしくお願い致します。

=====以下引用=======

list($w , $h) = getimagesize($tmpfile);

// 縦長か横長に応じて処理を変える

if($w >= $h){

// 横長の場合

$sq = $h; // 仮画像の正方形の辺は小さいほうになる。

$rspW = intval($w / 2) - intval($h / 2); // リサイズポイント:Width

$rspH = 0; // リサイズポイント:Height

} else {

// 縦長の場合

$sq = $w; // 仮画像の正方形の辺は小さいほうになる。

$rspH = intval($h / 2) - intval($w / 2); // リサイズポイント:Height

$rspW = 0; // リサイズポイント:Width

}

exec("convert -crop $sq"."x"."$sq+$rspW+$rspH $tmpfile $outputpath") ; // ここで正方形にトリミング

// すぐに次の作業に行くと画像ができてるかどうか不安なので時間稼ぎしてみる。

for($i = 0 ; $i < 500 ;$i++){$a = 1;}

exec("convert -quality 90 -resize 100x100\> $outputpath $outputpath2") ; // 前に作った正方形の画像を目的の100*100

2011/09/04 09:40:46
id:mjy No.4

mjy回答回数67ベストアンサー獲得回数202011/09/04 09:37:28

ポイント250pt

コマンドの例を示すと以下のようになります。

(mogrify は上書きしますから、必ずバックアップをお願いします。)

mogrify -thumbnail '100x100^' -gravity center -extent 100x100 ./file_name.jpg

find への組み込みかたは大丈夫ですよね?

(./file_name.jpg の所を '{}' にすれば良いはずです)

id:Slight_Bright No.5

Slight_Bright回答回数47ベストアンサー獲得回数22011/09/04 09:51:17

あー、失礼しました。上記のid:mjyさんのオプションでいけるのでは無いでしょうか。

私は何段階かのスクリプト処理で、と思ったのですが、まぁ、調べればちゃんと対応するオプションありますよね。

こちらも勉強になりました。

id:makkoch

こちらこそ、質問の仕方がややこしくて申し訳ありませんでした。

2011/09/04 10:36:07
id:mjy No.6

mjy回答回数67ベストアンサー獲得回数202011/09/04 09:55:02

ポイント250pt

先ほどの回答の簡単な解説です。


mogrify -thumbnail '100x100^' -gravity center -extent 100x100 ./file_name.jpg

まず、-thumbnail の geometry に ^ を付けることで、短かい方の辺が 100 になります。

つまり、 100x150 とか、150x100 となります。

(詳細: http://www.imagemagick.org/script/command-line-processing.php#geometry)


-gravity で、次に行なう -extent の基準を設定します。

(詳細: http://www.imagemagick.org/script/command-line-options.php#gravity)


-extent でサイズを設定します。これで長いほうの辺がカットされ、画像が 100x100 になります。

(詳細: http://www.imagemagick.org/script/command-line-options.php#extent)

id:makkoch

返信ありがとうございます。

解説していただいた方法で出来るはずなのですが、実行したところ

以下のエラーが出てしまいます。

mogrify: invalid argument for option `100x100^': -thumbnail.

こちらの環境に問題があるのでしょうか?

イメージマジックのバージョンは以下のとおりでした。

ImageMagick.x86_64 6.2.8.0-4.el5_5.3 installed

お手数をおかけしますが、引き続きよろしくお願い致します。

2011/09/04 10:26:38
id:you1031931 No.7

you1031931回答回数323ベストアンサー獲得回数32011/09/04 10:23:03

「うまくいきません」とはどう、うまくいかないのかが分からないので

回答しづらいです

古いバージョンとかは使ってないですか?

http://d.hatena.ne.jp/toku-hiro/20090202

http://blog.teachat.org/archives/4081552.html


http://d.hatena.ne.jp/mirakui/20110123/1295795409

id:mjy No.8

mjy回答回数67ベストアンサー獲得回数202011/09/04 10:53:09

ポイント250pt

どうしても ^ が使えない場合は、以下の様に identify で画像のサイズを取得し、がりがりとシェルスクリプトを書くしかないと思います。

identify -format '%w %h' file.jpg

まずは、最新の rpm をインストールして、試してみてはいかがでしょうか。

http://www.imagemagick.org/script/binary-releases.php

私のテスト環境は、ImageMagick 6.6.2-0 です。(これも古いですね)

id:mjy No.9

mjy回答回数67ベストアンサー獲得回数202011/09/04 12:00:01ここでベストアンサー

ポイント250pt

シェルスクリプトの例も書いておきます。

resize.sh というファイル名で保存し、実行権限を与えれば、

上で書かれているように、

find . -name "*.jpg" -exec ./resize.sh {} \;

で動くはずです。

(ただこのサムネイルの作り方で本当によいのでしょうか。

細長い画像の場合、よく分からないサムネイルになりますよね)

#! /bin/sh

file=$1

eval $(identify -format 'width=%w; height=%h' $file)

if [ $width -lt $height ]; then
	size='100'
else
	size='x100'
fi

mogrify -thumbnail $size -gravity center -extent 100x100 $file
id:makkoch

ご丁寧にありがとうございます。

ImageMagicを最新版にしたところ教えていただい通りできました!

シェルスクリプトも勉強になりました。

この度はどうもありがとうございました。

2011/09/04 17:13:16

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません