フォント圧縮は、たとえば 4 ビット近傍の算術コーディングを使用して、グリフ単位でも処理できます。
[ 4 ] [ 3 ] [ 2 ]
[ 1 ] ( x )
ピクセル p1、p2、p3、p4 の各近傍は、ビット「x」が処理された後に更新される x==0 対 x==1 の確率をコード化します。ハフマン コーダーとは異なり、算術コーダーは、シャノンの情報理論によって与えられる限界である 1 ビットよりも小さな単位でシンボルを圧縮できます。
Context, count bits per symbol
Zeros[ 0] = 45 Ones[ 0] = 4 19.987
Zeros[ 1] = 7 Ones[ 1] = 4 10.402
Zeros[ 2] = 6 Ones[ 2] = 0 0.000
Zeros[ 3] = 2 Ones[ 3] = 2 4.000
Zeros[ 4] = 6 Ones[ 4] = 5 10.934
Zeros[ 5] = 0 Ones[ 5] = 1 0.000
Zeros[ 6] = 2 Ones[ 6] = 0 0.000
Zeros[ 7] = 9 Ones[ 7] = 4 11.576
Zeros[ 8] = 5 Ones[ 8] = 13 15.343
Zeros[ 9] = 1 Ones[ 9] = 3 3.245
Zeros[10] = 4 Ones[10] = 0 0.000
Zeros[11] = 1 Ones[11] = 3 3.245
Zeros[12] = 2 Ones[12] = 2 4.000
Zeros[13] = 1 Ones[13] = 0 0.000
Zeros[14] = 1 Ones[14] = 5 3.900
Zeros[15] = 3 Ones[15] = 3 6.000
Total 92.634 bits = 12 bytes
vs. no context,
Zeros = 95 Ones = 49 133.212 bits = 17 bytes
明らかな問題は、配列を初期化する方法です。
1) 周波数の固定モデル、つまり静的モデルを
使用する 2) 最初は 50:50 の確率を想定して、完全に適応するモデルを
使用する 3) グリフを最もよく特徴付ける固定モデルのセット (2-256?) を使用する
4) 開始事前に計算されたセットからのいくつかのモデルと更新
完全なモデルでは、0..169 の値をエンコードするのに 32 バイトが必要になるため、非常に強力に (そして巧妙に) 圧縮しない限り、文字と共に渡すことはできません。
編集
単一の(または非常に少数のグローバル静的テーブルが使用されている)場合、テーブルを 5,6,7 ピクセル近傍に拡大するか、ピクセル位置の情報をテーブルに埋め込むこともできます(この方法は条件 'x のエンコードに失敗します一番下の行にあります'):
[ B ] [ C ] [ D ], where A,B,C,D = 00 for 'white'
[ A ] (x) 11 for 'black'
01/10 for pixel outside canvas
or
[ 1 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] + [ x is next to border? ]
[ 0 ] [ 2 ] (x)
詳細情報:
- Fax Compression / JBIG
-算術符号化