web-dev-qa-db-ja.com

JPEGをロスレス形式に変換し、品質を損なうことなく元に戻すことは可能ですか?

以前にJPEG形式で圧縮されたロスレスバージョンの画像があるとします(たとえば、mspaintでJPEG画像を開いてBMPとして保存した場合、このプロセスで一部のメタデータが失われることはわかっていますが、それは私の懸念事項ではありません)

それが可能かどうか、そして画質を損なうことなくJPEG形式に戻す方法、つまりすべてのピクセルがまったく同じであるかどうかを知りたいですか?

編集: JPEG画像をロスレス形式に変換しても、品質が向上しないことを完全に理解しています。私はこれを求めています:私はSWFファイルから抽出されたPNGファイルを持っています。元々(SWFファイルで)オブジェクトはJPEG画像+アルファチャンネルでした。ファイルサイズは私が持っているPNGファイルと比較してはるかに小さいです。元の形式(JPEG +アルファチャネル)が必要ですが、元のSWFファイルのコピーがもうありません(オンラインでもコピーが見つかりませんでした)ので、抽出プロセスをやり直すことができません。

2
RadarNyan

基本的に、あなたが求めているのは、JPEG画像のデコードプロセスを逆にすることができるかどうかです。これは、従来のJPEGエンコーダーの意図とは大きく異なり、これを実現するソフトウェアはありません。数学的には可能です*。エンコード後に画像に変換やその他の変更が適用されていない限り、プログラム的にそれはどれほど難しいでしょうか?

最初の問題は色空間です。JPEGはサブサンプリング(ピクセルのグループでサンプリングされた色)yCbCrを使用しますが、ビットマップはRGBです。これらの色空間間で(およびガンマ調整でも)変換する必然的な損失により、ノイズが発生します。解決すべき2番目の問題は、JPEGが画像データをマクロブロック(NxNサイズのサブ画像)として記録することです。これは、デコーダーの出力画像から推測する必要があります。 JPEG形式とエンコードプロセスのより詳細な説明はここにあります http://www.guillermito2.net/stegano/jsteg/

JPEGの「デコード解除」:

元のJPEGデータの近似値を作成するには、マクロブロックのサブサンプリング、サイズ、配置、およびそれらのエンコードに使用された離散コサイン変換(DCT)係数を見つける必要があります。残りは通常のJPEGエンコーディングプロセスと同じです。頭に浮かぶ素朴な実装の1つは、「知識に基づいた推測とチェック」です。画像の作成にいくつかの一般的なJPEG実装が使用されたと想定し、DCTから「JPEGのような」結果が得られるまでそれらを適用してみます(通常はゼロ高周波)。

その後、元の画像(つまり、圧縮された画像のビットマップ)と比較してエラーが最小になるように係数を微調整します。このプロセスでも、エラーとファイルサイズの間でトレードオフが発生しますが、実用的な目的には十分に近づくはずです。

出典:個々のフレームにJPEGのようなコーディングを適用するDNxおよびProResビデオコーデックを検証する以前の雇用(デコードされたフレームを反転するソフトウェアは非常に興味深く、潜在的に有用なサイドプロジェクトでした) 。

*元のJPEGデコーダーを通過したときに同じ出力を生成する入力データのセットが存在しますが、デコード中に情報が失われたため、再構築が元のファイルのバイト単位のコピー(メタデータを無視)になる可能性はほとんどありません。処理する。

3
Liam

JPEGは不可逆形式であり、それを回避する方法はありません。圧縮品質が100の場合でも、圧縮率は2.6:1です( Wikipedia JPEG )。

Lossless JPEG には、JPEG 2000など、いくつかの亜種が提案されていましたが、それらは追いついておらず、サポートは非​​常に貧弱です。

[〜#〜] png [〜#〜] などのロスレス形式に変換することをお勧めします。この形式でも圧縮されますが、損失はありません。

4
harrymc

JPEGに変換すると、ほぼ確実に情報が失われました。そのファイルをBMPに変換すると、JPEGに保存されている情報が保持されますが、BMPをJPEGに戻すと、さらに多くの情報が失われる可能性があります。

0
PiedPiper