特定のディレクトリ以下にある大量の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を設定させて頂きました。
よろしくお願い致します。
シェルスクリプトの例も書いておきます。
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
mogrifyのオプションを確認してませんが、一般に同じディレクトリにあるファイルに同じ操作をスクリプト処理するのであれば、以下の通り。
for i in *.jpg;do mogrify $i -quality 80 -thumbnail 100x100 {};done
一応こちらでも試してみますが。
確認しました。
for i in *.png;do mogrify -quality 80 -thumbnail 100x100 $i;done
で、842x595を100x71に一括処理できました。
回答ありがとうございます。
せっかく試して頂いて申し訳ありませんが、
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
コマンドの例を示すと以下のようになります。
(mogrify は上書きしますから、必ずバックアップをお願いします。)
mogrify -thumbnail '100x100^' -gravity center -extent 100x100 ./file_name.jpg
find への組み込みかたは大丈夫ですよね?
(./file_name.jpg の所を '{}' にすれば良いはずです)
あー、失礼しました。上記のid:mjyさんのオプションでいけるのでは無いでしょうか。
私は何段階かのスクリプト処理で、と思ったのですが、まぁ、調べればちゃんと対応するオプションありますよね。
こちらも勉強になりました。
こちらこそ、質問の仕方がややこしくて申し訳ありませんでした。
先ほどの回答の簡単な解説です。
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)
返信ありがとうございます。
解説していただいた方法で出来るはずなのですが、実行したところ
以下のエラーが出てしまいます。
mogrify: invalid argument for option `100x100^': -thumbnail.
こちらの環境に問題があるのでしょうか?
イメージマジックのバージョンは以下のとおりでした。
ImageMagick.x86_64 6.2.8.0-4.el5_5.3 installed
お手数をおかけしますが、引き続きよろしくお願い致します。
「うまくいきません」とはどう、うまくいかないのかが分からないので
回答しづらいです
古いバージョンとかは使ってないですか?
http://d.hatena.ne.jp/toku-hiro/20090202
http://blog.teachat.org/archives/4081552.html
どうしても ^ が使えない場合は、以下の様に identify で画像のサイズを取得し、がりがりとシェルスクリプトを書くしかないと思います。
identify -format '%w %h' file.jpg
まずは、最新の rpm をインストールして、試してみてはいかがでしょうか。
http://www.imagemagick.org/script/binary-releases.php
私のテスト環境は、ImageMagick 6.6.2-0 です。(これも古いですね)
シェルスクリプトの例も書いておきます。
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
ご丁寧にありがとうございます。
ImageMagicを最新版にしたところ教えていただい通りできました!
シェルスクリプトも勉強になりました。
この度はどうもありがとうございました。
ご丁寧にありがとうございます。
ImageMagicを最新版にしたところ教えていただい通りできました!
シェルスクリプトも勉強になりました。
この度はどうもありがとうございました。