このページではJpegcollがどのようにして修正された部分だけを置き換えているかを解説します。
次の図にJpegcollにおけるデータと処理の流れを示します。
Jpegcollは内部で以下の4つの処理をしています。図では角丸の四角の部分です。うち3つはIJG開発のツールで一部改造を加えています。
djpeg (IJGのツール・jpegデコーダ)
cjpeg (IJGのツール・jpegエンコーダ・改造あり)
jpegtran (IJGのツール・ロスレスで様々な操作(切り抜きや回転等)をするツール・改造あり)
compare(二つのBMP画像の間で差分をとり、マップを作る処理)
各処理について次の節で説明します。
IJGのJPEGデコーダです。改造を加えていません。処理の都合上白黒のJPEGであっても24bitBMPを出力をするように設定しています。
IJGのJPEGエンコーダcjpegに改造を加えています。画像圧縮時、圧縮の設定(QTableやSampling factor)を既存のJPEGファイルから取り込むことができるようにしています。これによりOriginal JPEGと同じ設定でRetouchd BMPをJPEG圧縮できます。
二枚のBMP画像をMCU(Minimum Coded Unit : 8x8~16x16のブロック)単位で比較し、各MCUの差分の数をマップに記憶する処理です。このマップは下記のjpegtranで使用します。
"-drop"オプションにパッチをあてて使用しています。"-drop"は指定された矩形領域のデータを他のJPEGのデータで置き換えるというスイッチです。これに"compare"処理で作成しておいた差分マップを読み込み、差分のあるMCUのみ"-drop"によるデータ置き換えを適用するような改造を行っています。
上記のような処理を組み合わせることでJpegcollは修正されたブロックのみを置き換えることができます。この特長的な動作を実現するためのポイントは以下の二つです。
Original BMPとRetouchd BMPを比較することにより正確にどのブロックを修正したかを判断することができる。
Original JPEGと同じ設定でRetouched BMPをJPEG圧縮してRetouchd JPEGを作成するため、Original JPEGとRetouchd JPEGがMCU単位でマージ可能になる。