EPS 画像を Picasa で属性指向管理

自分の計算機環境では,2,000 個くらいの画像ファイルがさまざまなディレクトリに散らばっている.これを,どう管理するかがずっと悩みの種だった.

今日も,昔描いた画像をあちこちから拾って来て文書を作る作業に追われてたのだが,いちいちディレクトリを開いてプレビューを見て探すのがあまりに面倒でついにブチ切れた ヽ(`Д´)ノウワァァン!!



ここでふと,Picasa を使ったらどうだろう? と気付く.PicasaGoogle が開発した画像管理ツールで,iTunes と同じく属性指向インタフェースである.英語版が出た頃に試用してみたが,あるディレクトリ以下の画像を根こそぎ拾って一覧を表示したり,タイムライン順に並べたりと,かなりいけてたりする.

ただし二つほど問題がある.

まず,自分の使っている画像の多くは Illustrator AI フォーマットか Adobe EPS フォーマットなんだけど,Picasa は認識してくれないのだ (PhotoShop PSD は認識できるようだけど).うーむ.

もう一つ,属性指向な Picasaディレクトリという概念をすっぱり排していて,ファイル名と直上のディレクトリ名くらいしか表示しない.しかし私の場合,path にプロジェクトの名前など各種情報が乗っているので,ちょっと困ったりする.うーむ.



というわけでですね,
  • 散らばった EPS から JPG サムネイルを作って一つのディレクトリに集約する.
  • サムネイルのファイル名は,元ファイルの path とタイムスタンプから生成する.
  • サムネイルのタイムスタンプは元ファイルと同一時刻とする (Picasa タイムライン機能のため).
  • Picasa でこのディレクトリのみ常時監視していれば(゜Д゜)ウマー
な環境を実現すべく,以下のようなスクリプトを書いて実行し,gifs ディレクトリを Picasa で読む.

#!/usr/local/bin/perl
use strict;
my %hash = "";
my $option = "";
my $line = "";
set_mtime();
my @filelist = `find $TEXDIR -name "*.eps" $option`;
my $len = @filelist;
print "$len file(s).\n";
for (@filelist){
    chomp;
    my $orig = $_;
    print "$orig\n";
    my $base = `basename $orig`;
    chomp($base);
    my @filestat = stat;
    my $utime = $filestat[9];
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = 
	localtime($utime);
    $year += 1900;
    $mon += 1;
    my $date = sprintf("%4d%02d%02d", $year, $mon, $mday);
    my $size = $filestat[7];
    if ( exists($hash{$size}) ){
	if ( $hash{$size} == $base ){
	    print "$base ($size bytes) is redundant. Skipping.\n";
	    next;
	}
    }
    $hash{$size} = $base;
    s+^$TEXDIR++;
    s+/+\@+g;
    s/\.eps$/\@$date.jpg/;
    my $path = $_;
    my $gif = "$DEST/$path";
    system("convert -size 200 $orig $gif");
    utime($utime, $utime, $gif);
}
sub set_mtime{
    my $now = time;
#    print "now: $now\n";
    my $last = "$DEST/last";
    
    if ( open(IN, "<$last")){
	$line = <IN>;
#	print "last: $line\n";
	close(IN);
    } 
    open(IN, ">$last") || die "Can't open $last.\n";
    if ( $line == "" ){
	print "First execution.  All files are converted.\n";
    } else {
	my $diff = int(($now - $line)/(60*60*24));
	$diff = 1 if ( $diff == 0 );
	print "Files for last $diff day(s) are converted.\n";
	$option = "-mtime -$diff";
    }
    print(IN $now);
    close(IN);
}

注意点:

  1. 例外処理とか一切無視(ぉ
  2. ImageMagick の convert が必要.
  3. convert は AI は扱えなかったので,AI はあきらめて EPS だけを対象とした.個人的にはそれで十分.
  4. path の区切りには,最初 ":" を使ったら Picasa が認識できなかったので,"@" とした.
  5. gs が読めない PostScript (日本語フォントが入ってるとか) は convert できない.
  6. mtime をみて,前回の実行以降に更新されたファイルのみを対象としている.
  7. 重複ファイルについては,とりあえずファイル名とファイルサイズが一致したものは skip させた.これで画像数は 700 くらいにまで落とせた.この過程でうっかり skip されてしまう unique なファイルがないとは言い切れない.ちなみに Picasa には重複ファイル監視機能があるが,いまいちどう働いてるのかわからない.
  8. Picasa からアクセスできるのはサムネイルでしかないので,元ファイルを開くには「サムネイル名からパスを把握して手動でたどる」必要がある.つまり,「一覧的にパスを確認するためのツール」でしかない.最終的にはここもなんとかしたいが,個人的には,これまでのパス手動探索の手間に比べれば 100 倍ましになった.
  9. last ファイルを開閉しているところ,なんか冗長で変なんですが,いいや(ぉ
  10. Picasa 側は日付順表示にしておくと探しやすい.
なんか前回のエントリで紹介した「横着をするための労力を惜しんではいけない、という口実で現実逃避してしまう」法則 [2005-10-16] の見事な例になってしまった….