OSTRACISM CO.
C#とObjective-CとJavaと...
要求仕様
GraphicGripGropの要求仕様。
1. 指定された画像ファイルと同じ画像のファイルを指定ディレクトリ以下から再帰的に検索する。
2. 同じと判断する方法は、かなり荒いサムネールを作り、それをバイナリ比較する。
3. 数十枚程度ならまだしも、デジカメの普及した現在、数百枚数千枚はあたりまえに検索対象になる。となるとかなり重い処理になるので、サムネールデータのインデックスファイルを作り、そこからの検索もする。
4. みつかった画像ファイルはパスを一覧し、ダブルクリックで表示させる。
5. 可能な限り手を抜く。
設計
1. サムネール
サムネールは8x8=64ピクセルで、ピクセル深度は4x3=12 bitとする。各色は16段階でかなりおおざっぱなモザイクだが、試行錯誤でこう固まった。これでも768bitの識別子なのである。
2. インデックスファイル
各情報をチャンクで表現する。知らないチャンクIDは無視する。比較的仕様変更に強くできるようにしておく。
C風に表現すると
struct Chunk {
Int32 ckID; // チャンクID
Int32 ckSize; // チャンクサイズ
};
を頭に持ち、ckSizeサイズのデータが後に続く。これの繰り返し。
ヘッダチャンク
struct ChunkHead {
Int32 ckID; // 'GGHD'
Int32 ckSize; // 256
Int32 version; // 0x100
Int32 pixelNumber; // 8 (8x8の8で当面固定)
// (プログラムは固定として扱わないようにする)
Int32[62] dummy;
};
パスチャンク
struct ChunkPath {
Int32 ckID; // 'GGPT'
Int32 ckSize; // パスの長さ
char[] path; // パス(UTF-8エンコード)
};
サムネールチャンク
struct ChunkThumb {
Int32 ckID; // 'GGTB'
Int32 ckSize; // サムネールの長さ(8*8*2、12bitは16bitで保存)
// (もちろんプログラムは固定として扱わないようにする)
short[] thumbnail; // サムネール
};
2005.07.04
「インデックス」へ戻る
OSTRACISM CO.
OSTRA / Takeshi Yoneki