作業日記@HatenaBlog

各種の作業メモ

便利なftp機能

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
として実行権を付与。

#!/bin/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の中身

M ",/^_[`jpqy| M

/ !"#$%&'()*+ /
< ,-./01234567 <
> 89:;<=>?@ABC >
@ DEFGHIJKLMNO @
_ PQRSTUVWXYZ[ _
{ \]^_`abcdefg {
} hijklmnopqrs }
~ tuvwxyz{|}~ ~

M ",/^_[`jpqy| M