大量画像ファイルの連番処理



ffmpegというソフトを使って連続写真を動画にするのがやりたかったのです。

結論を知りたい人はいちばん下のをみてください。

MacでスマホのSDカードに入った写真をうまくUSBでコピーできず、
Flickr Uploadというアプリでアップロードしたのですが、

kimg2150_23977558372_o.jpg

とかそういうファイル名になってしまっていてkimgNNNNの部分は数字なのに後ろに色々ついてしまってかなり面倒なことになってしまった。

そこから色々試行錯誤して、

○まず、__oというのが邪魔なので
http://uguisu.skr.jp/Windows/find_xargs2.html
を参考に変数展開を使って、_o.jpgをとって、.jpgをつけなおすことで、結果として_oをとるみたいな。

(コマンドは全部対象の画像ファイルが入っている状態で、実行。)

find * -maxdepth 0 -name "*.jpg" -print0 | while read -r -d '' file; do mv "$file" "${file%%_o.jpg}.jpg"; done

○次に、連番になってるのはIMGとかついてていいんだと思って、
最初の7文字だけとる。

for f in *.jpg
do
    foo=${f}
    foo=${foo:1:7}
    mv $f $foo.jpg
done

で、実はimgとかいらないので

for f in *.jpg; do
mv $f ${f#img};
done

さらに、ここまできて、ffpmegの入力は0001.jpgのように1から始まる連番でないといけないということに気づく。
いまの状態では

2034.jpg
2035.jpg
2036.jpg
2037.jpg
 :
 :

 みたいなものなので、全部1からふりなおし(ただしゼロ埋め)しないといけない。

x=1;
for f in *.jpg
do
    mv $f $(printf "%04d.jpg" $x)
    x=$((x+1))
done


○回転(jpegtran) (ひっくり返ってた時のみ)
たぶんこれはスマホで撮っていると気がつかないうちに上下逆になってたりすると思います。
逆になっている画像はjpegtranなるものを使って180反転。
http://robotics.usc.edu/~ampereir/wordpress/?p=702

このjpegtranは標準出力に画像のバイナリを出力するようなのでリダイレクトはつけないといけないみたいです。

for f in *.jpg
do
    foo=${f}
foo=${foo:1:4}
    jpegtran -rotate 180 --copy all $f > $foo.jpeg
done



◎結局、、これ一発でよかったんだ・・・

x=1;
for f in *.jpg
do
    foo=${f}
foo=${foo:4:7}
    mv $f $(printf "%04d.jpg" $x)
    x=$((x+1))
done


コメント