理論的には、JPEG 形式から取得されたことが知られている BMP 画像を JPEG 形式にロスレスでエンコードすることは可能です。つまり、次の変換を行うことができます。
JPEG A => BMP X -> JPEG B => BMP X
ここ=>
で、 は解凍操作、->
は圧縮操作です。
これはあなたが求めているものではないことに注意してください。あなたは上記に加えてそれを求めていJPEG A == JPEG B
ます。すべての JPEG 表現が一意の画像にデコードされるとは思えませんが (確かなことはわかりません)、この保証はできないと思います。
可逆符号化が可能な理由は、特定のサイズと深さの画像の JPEG 表現の数が有限であるためです。この数は手に負えないほど大きいですが、それでも有限です。エンコード アルゴリズムは、BMP 画像と正確に一致する表現が見つかるまで、これらの表現のそれぞれをデコードし、その表現を出力するだけです。このアルゴリズムは完全に実用的ではありませんが、問題が制限されていることを示しています。
実用的なアルゴリズムが存在する可能性があります。たとえば、次のような反復アプローチを想像できます。
- 初期圧縮パラメーター (カラー サンプリングと量子化) を選択します。
- BMP 画像を候補 JPEG に圧縮します。
- 候補 JPEG を解凍します。
- 解凍された画像を元の BMP と比較します。
- 同じであれば、候補の JPEG を出力して終了します。
- 異なる場合は、圧縮パラメーターを更新し、ステップ 2 に戻ります。
トリックはその更新ステップにあります-画像の差分がどのようにパラメーターを改善するかを理解する.
ほとんどのケースで機能するコードを記述できる可能性があります。基本的にカラー サンプリングの選択肢は 3 つしかなく、量子化行列を生成するアルゴリズムはそれほど多くないと思います。それらをすべて実装するか、代わりにインターネットをスキャンして JPEG ファイルを探し、固有の圧縮パラメーターを記録することができます。次に、主に新しく作成された圧縮プログラムからのイメージで失敗することが予想されます。
これらのアプローチは、操作に同じ圧縮解除プログラムを使用することに依存することに注意することが重要です=>
。異なる圧縮解除プログラムでは、1 つの JPEG ファイルからビットごとに同じ画像が生成されない可能性があるためです。