アップロードなし, 100%ローカル, アカウントなし

記事

保存のたびに画像が劣化する理由

カメラロールでは鮮明だった写真が、いくつかのグループチャットで転送され、何度か再投稿されたあとにはブロックノイズだらけになっています。誰も意図的に編集していません。ただ何度か再エンコードを経ただけで、そのたびに少しずつ詳細が失われました。これは世代損失と呼ばれる、不可逆圧縮についての古くからよく理解されている性質で、大きく再共有された画像が徐々に悪くなって見える理由を説明します。ここでは、不可逆な再エンコードが実際に何を捨てているのか、なぜそれが積み重なるのか、そしてファイルがこれ以上劣化しないようにする方法を見ていきます。

「ロッシー」が実際に捨てているもの

オンラインで共有されるほとんどの写真の背後にある形式であるJPEGは、設計上不可逆です。その規格であるITU-T T.81は、ピクセルのブロックを周波数データに変換し、そのデータを画質設定に応じて多かれ少なかれ大胆に丸める、量子化と呼ばれるステップによって動作します。丸め処理は正確には元に戻せません。捨てられた詳細はファイルのどこかに隠れているのではなく、本当になくなっています。高い画質設定は穏やかに丸めるため損失は見えにくく、低い設定は激しく丸めるため目に見えてブロック状になりますが、たとえ1回のJPEG保存であっても常に何かを捨てています。

再エンコードのたびに新しい世代になる

写真が最初にJPEGとして保存されるとき、カメラのピクセルデータは一度量子化されます。まったく編集していなくても、そのJPEGを再び開いて再び保存すると、すでに近似化されたピクセルをデコードし、最初の丸めの代わりではなく、その上に重ねてもう一度量子化します。追加の保存のたびに新しい世代となり、そのたびに前の世代がすでに持ち込んだブロックノイズや色帯を積み重ねます。適切な画質設定での1回の処理はほとんど目に見えませんが、同じ設定を同じファイルに5〜6回続けて適用すると、写真は目に見えて劣化します。それより前のすべての世代からの誤差が、次の世代が再び丸める時点でまだ残っているからです。

5世代のJPEG連鎖:それぞれの再エンコードは前の世代のすでに丸められたピクセルから始まり、5世代目には画像が目に見えてブロック状になる

大きく再共有された画像がより悪く見える理由

いくつものチャットやフィード、再アップロードを経由する写真は、ほぼすべてのやり取りで新しい世代を重ねていきます。メッセージアプリがチャット用に再圧縮し、SNSプラットフォームが自社の配信パイプラインのために再びエンコードし、誰かがその結果をスクリーンショットして再アップロードします。これはすでに劣化した画像のさらにもう一度のフルの再エンコードです。これらのどのステップも、その効果が積み重なるために特別にずさんである必要も、異常に低い画質設定を使う必要もありません。それは本質的に累積するものであり、だからこそ長い間広く出回った画像は、同じ写真の新しいコピーよりも目に見えて多くのブロックノイズと色帯を示すことが多いのです。

ロスレス形式にはこの問題がない

PNGとロスレスWebPは違う仕組みで動きます。正確なピクセルデータの中からパターンを見つけ、何も丸めて捨てることなく、より効率的に詰め込むことで圧縮します。そのため、編集を加えずに同じロスレスファイルをデコードして再エンコードすると、世代を重ねてもピクセルは正確に再現されます。この保証があるからこそ、スクリーンショットやくっきりした縁やテキストのあるグラフィックは、通常JPEGではなくPNGとして保存されます。代償もあります。典型的な写真のロスレスファイルは、妥当な画質のJPEGよりずっと大きくなります。縮小するための丸め処理がないためです。

10回の再保存を比較:JPEGは目に見えるブロックアーティファクトが積み重なっていくが、ロスレスPNGは元とピクセル単位で同一のまま

ファイルの画質をコントロール下に保つ

世代損失の連鎖は、各保存が前の保存のすでに劣化したピクセルから始まるときだけ積み重なります。ロスレスのマスター(元のカメラファイルやPNG)を保持し、そのマスターから毎回新しいJPEGを書き出すことで、古い丸めの上に新しい丸めを積み重ねることを避けられます。当サイトの画像圧縮ツールは、何かを送信する前に画質設定と結果のファイルサイズを確認できるようにし、当サイトの画像比較ツールはスライダーで元と圧縮後のコピーを並べて表示するため、ファイルを転送してもう一つの世代を始める前に、悪い設定に気づくことができます。どちらも完全にブラウザ内で動作します。確認する写真が端末を離れることはありません。

この記事で紹介するツール

よくある質問

JPEGファイルをコピーしたり移動したりすると劣化しますか?

いいえ。ファイルをコピーしたり、メールに添付したり、フォルダ間で移動したりするのは、まったく同じバイトをコピーするだけです。何もデコードや再エンコードされないため、何も再度量子化されません。世代損失は、ピクセルが実際に開かれて再び保存されたときにだけ起こります。ファイル自体が移動するときには起こりません。

世代損失を元に戻して失われた詳細を復元できますか?

いいえ。量子化は本当に不可逆です。以前の保存で捨てられた丸められた周波数データは、ファイルのどこにも記録されていないため、どんなフィルターやアルゴリズムもそれを再構築できません。劣化したJPEGをシャープ化やノイズ除去すれば、アーティファクトを視覚的に目立たなくすることはできますが、元の詳細を復元するわけではありません。

劣化したJPEGをPNGに変換すれば問題は止まりますか?

損傷が起きたあとに変換すれば、その時点でのJPEGの見た目をピクセル単位で保存でき、新しい丸めのステップを加えることはありませんが、それ以前の保存で失われた詳細を復元することはできません。修正方法は、連鎖のあとの方で写真を変換することではなく、これ以上世代を重ねる前にロスレスのマスターを保持し始めることです。

出典