PanasonicのBL-C30はftp機能を備えているので、自宅サーバに5分おき画像を保存することにした。
http://ctlg.panasonic.jp/product/info.do?pg=04&hb=BL-C30
カメラからアップロードされるファイルの書式
- image20060513093635972.jpg
- 「image」部分はユーザ定義可。とりあえずimageとした
- 数字は 2006_05_13_09_36_35_972 のように分けられる
- 末尾の3桁はたぶんmsec(ミリ秒)
5分おきアップロードといっても、カメラの起動時点で5分おきであってHH:00、HH:05…のように必ずしもならない。
しょうがないので分は5の倍数になるようにシェルスクリプトで調整することにする。
シェルスクリプト
特定のディレクトリにftpされるように設定。
ファイルがどんどん溜まる一方になるため、24時間で一回りするようシェルスクリプトでリネームする。
スクリプト名は「filename_conv.sh」とした。もちろん
# chmod a+x filename_conv.sh
として実行権を付与。
DIRPATH=`dirname $0`
for FILES in $DIRPATH/image*.jpg ; do
if [ ! -e $FILES ]; then
exit 0
fi
FILENAME=`basename $FILES`
FILENMBR=$(echo $FILENAME | sed 's/.*\(.\{21\}\)$/\1/' | sed 's/^\(.\{12\}\).*/\1/')
#FILEINFO=`ls -l $FILES`
TIMESTAMP1=$(expr $(expr $(echo $FILENMBR | sed 's/.*\(.\{4\}\)$/\1/') / 5) \* 5 | awk '{printf "%04d",$1}' )
TIMESTAMP2=$(echo $TIMESTAMP1 | sed 's/^\(.\{2\}\).*/\1/')":"$(echo $TIMESTAMP1 | sed 's/.*\(.\{2\}\)$/\1/')
DAYSTAMP=$(echo $FILENMBR | sed 's/^\(.\{8\}\).*/\1/' | sed 's/.*\(.\{2\}\)$/\1/')
MONTHSTAMP=$(echo $FILENMBR | sed 's/^\(.\{6\}\).*/\1/' | sed 's/.*\(.\{2\}\)$/\1/')
YEARSTAMP=$(echo $FILENMBR | sed 's/^\(.\{4\}\).*/\1/')
DATESTAMP=$YEARSTAMP"/"$MONTHSTAMP"/"$DAYSTAMP","$TIMESTAMP2
TONAME1=$DIRPATH"/p"$TIMESTAMP1".jpg"
TONAME2=$DIRPATH"/p"$TIMESTAMP1"t.jpg"
TONAME3=$DIRPATH"/anim_tmp/p"$TIMESTAMP1".jpg"
BINDIR="/usr/local/bin"
$BINDIR/convert -geometry 128x96 $FILES $TONAME2
$BINDIR/pbmtext -font $DIRPATH/font.pbm $DATESTAMP | $BINDIR/pnmcrop | $BINDIR/pnmpad -white -left=1 -right=1 -top=1 -bottom=1 > $DIRPATH/timestamp1.pbm
$BINDIR/pnmpad -white -left=1 -right=1 -top=1 -bottom=1 < $DIRPATH/timestamp1.pbm > $DIRPATH/timestamp2.pbm
$BINDIR/pnmcomp -align=right -valign=bottom $DIRPATH"/"timestamp1.pbm $DIRPATH/white.pbm > $DIRPATH/mask1.pbm
$BINDIR/pnmcomp -align=right -valign=bottom $DIRPATH/timestamp2.pbm $DIRPATH/white.pbm > $DIRPATH/mask2.pbm
$BINDIR/djpeg -pnm $FILES > $DIRPATH/JPGTOPPM.ppm
$BINDIR/pnmcomp -alpha=$DIRPATH/mask1.pbm $DIRPATH/JPGTOPPM.ppm $DIRPATH/black.pbm | $BINDIR/pnmcomp -alpha=$DIRPATH/mask2.pbm - $DIRPATH/white.pbm | $BINDIR/pnmtojpeg --quality=85 > $TONAME1
#if [ $TIMESTAMP1 -le 0030 -o $TIMESTAMP1 -ge 0500 ]; then
if [ $TIMESTAMP1 -ge 0500 ]; then
$BINDIR/convert -geometry 256x192 $TONAME1 $TONAME3
elif [ $TIMESTAMP1 -eq 0100 ]; then
$BINDIR/convert -loop 0 -delay 15 $DIRPATH"/anim_tmp/p*.jpg" $DIRPATH"/anim_tmp/24anim.gif"
elif [ $TIMESTAMP1 -eq 0430 ]; then
/bin/mv $DIRPATH"/anim_tmp/24anim.gif" $DIRPATH"/24anim.gif"
fi
rm $FILES
rm $DIRPATH/JPGTOPPM.ppm
rm $DIRPATH/mask[1-2].pbm
rm $DIRPATH/timestamp[1-2].pbm
done
exit 0
$BINDIR
シェルスクリプトの基礎知識に乏しいため、cronで回すとなぜかコマンドへのパスがうまく渡らなくなる。
$BINDIRを書いて無理やり調整。
ここをきちんと出来れば、たぶんもっとスマートな記述になると思われ。
画像変換
アップロードされる元画像は640x480ピクセル。
これをリネームし、さらにコピー&縮小してサムネールを作る。
サムネールの大きさは128x96。
(変換例)
- image20060513093635972.jpg
- リネーム:p0935.jpg 640x480
- サムネール:p0935t.jpg 128x96
- gifアニメ用:./anim_tmp/p0935.jpg 256x192
あとでImageMagickを使ってgifアニメも作るのでanim_tmp/ディレクトリにもコピーしておく。
netpbm
netpbmを使って元画像に日付スタンプをオーバーライトする。
マスク用画像として640x480の黒単色、白単色の画像、さらにpbmtextで使うフォント画像を用意する。
(pbmtextの参考サイト)
http://netpbm.sourceforge.net/doc/pbmtext.html
- black.pbm
- white.pbm
- font.pbm
font.pbmの中身
/ !"#$%&'()*+ /
< ,-./01234567 <
> 89:;<=>?@ABC >
@ DEFGHIJKLMNO @
_ PQRSTUVWXYZ[ _
{ \]^_`abcdefg {
} hijklmnopqrs }
~ tuvwxyz{|}~ ~
M ",/^_[`jpqy| M