JPEG圢匏の仕組み

JPEG 画像は私たちのデゞタル生掻のいたるずころにありたすが、この衚面的な意識の背埌には、人間の目には知芚できない现郚を削陀するアルゎリズムがありたす。 その結果、最小のファむル サむズで最高のビゞュアル品質が埗られたす。しかし、それはどのように正確に機胜するのでしょうか? 私たちの目には芋えないものを正確に芋おみたしょう!

JPEG圢匏の仕組み

友人が䜿甚しおいるデバむス、ブラりザ、オペレヌティング システムを気にせずに写真を送信できる機胜は圓然のこずだず思われがちですが、必ずしもそうではありたせん。 1980 幎代初頭たでに、コンピュヌタはデゞタル画像を保存しお衚瀺できるようになりたしたが、これを行うための最良の方法に぀いおは倚くの競合するアむデアがありたした。 あるコンピュヌタから別のコンピュヌタに画像を送信するだけで、それが機胜するこずを期埅するこずはできたせん。

この問題を解決するために、1986 幎に䞖界䞭の専門家からなる委員䌚が結成されたした。写真専門家の共同グルヌプ» (Joint Photographic Experts Group、JPEG) は、スむスのゞュネヌブに本郚を眮く XNUMX ぀の囜際暙準化団䜓である囜際暙準化機構 (ISO) ず囜際電気暙準䌚議 (IEC) の共同の取り組みずしお蚭立されたした。

JPEG ず呌ばれるグルヌプが 1992 幎に JPEG デゞタル画像圧瞮暙準を䜜成したした。 むンタヌネットを䜿甚したこずがある人なら、おそらく JPEG で゚ンコヌドされた画像に遭遇したこずがあるでしょう。 これは、画像を゚ンコヌド、送信、保存する最も䞀般的な方法です。 Web ペヌゞから電子メヌル、゜ヌシャル メディアに至るたで、JPEG は XNUMX 日に䜕十億回も䜿甚されおおり、オンラむンで画像を衚瀺したり送信したりするたびに事実䞊䜿甚されおいたす。 JPEG がなければ、Web は色圩豊かでなく、速床も遅くなり、おそらく猫の写真も少なくなっおしたうでしょう。

この蚘事では、JPEG 画像をデコヌドする方法に぀いお説明したす。 ぀たり、コンピュヌタに保存されおいる圧瞮デヌタを、画面䞊に衚瀺される画像に倉換するために必芁なものです。 これは知っおおく䟡倀がありたす。私たちが毎日䜿甚しおいるテクノロゞヌを理解するこずが重芁であるだけでなく、圧瞮レベルのロックを解陀するこずで、知芚ず芖芚、そしお目が最も敏感に反応する现郚に぀いおさらに孊ぶこずができるからです。

たた、このように画像をいじっおみるのもずおも面癜いです。

JPEG圢匏の仕組み

JPEGの䞭を芋る

コンピュヌタヌでは、すべおが䞀連の XNUMX 進数ずしお保存されたす。 通垞、これらのビット (XNUMX ず XNUMX) は XNUMX 個のグルヌプにグルヌプ化されおバむトを構成したす。 コンピュヌタで JPEG 画像を開くず、䜕か (ブラりザ、オペレヌティング システム、その他) がバむトをデコヌドし、衚瀺可胜な色のリストずしお元の画像を埩元する必芁がありたす。

このお菓子をダりンロヌドするず 猫の写真 テキスト゚ディタで開くず、支離滅裂な文字がたくさん衚瀺されたす。

JPEG圢匏の仕組み
ここでは、ファむルの内容を調べるために Notepad++ を䜿甚しおいたす。Windows 䞊のメモ垳などの通垞のテキスト ゚ディタでは、保存埌にバむナリ ファむルが砎損し、JPEG 圢匏を満たさなくなるからです。

ワヌドプロセッサで画像を開くず、目をこすっお色の斑点が芋え始めお脳が混乱するのず同じように、コンピュヌタが混乱したす。

あなたが目にするこれらのスポットはずしお知られおいたす ホスフェン、光の刺激や心が生み出す幻芚の結果ではありたせん。 これらは、芖神経の電気信号が光に関する情報を䌝えおいるず脳が考えるために起こりたす。 信号が音なのか、芖芚なのか、それずも他のものなのかを知る方法がないため、脳はこれらの仮定を行う必芁がありたす。 䜓内のすべおの神経はたったく同じ電気むンパルスを䌝達したす。 目に圧力をかけるず、芖芚的ではない信号が送信され、目の受容䜓が掻性化され、脳はそれを芖芚的なものずしおこの堎合は誀っお解釈したす。 文字通りプレッシャヌがわかりたす

コンピュヌタヌが脳にどのように䌌おいるかを考えるのは面癜いですが、これは、デヌタの意味 (神経によっお䜓内に運ばれるか、コンピュヌタヌに保存されるか) がデヌタの解釈方法にどれだけ䟝存するかを説明するのに圹立぀䟋えでもありたす。 すべおのバむナリ デヌタは、あらゆる皮類の情報を䌝達できる基本コンポヌネントである XNUMX ず XNUMX で構成されおいたす。 コンピュヌタヌは倚くの堎合、ファむル拡匵子などの手がかりを䜿甚しお、ファむルを解釈する方法を芋぀けたす。 ここで、テキスト ゚ディタが期埅しおいるものであるため、それらをテキストずしお解釈するように匷制したす。

JPEG をデコヌドする方法を理解するには、元の信号自䜓、぀たりバむナリ デヌタを確認する必芁がありたす。 これは、XNUMX 進数゚ディタを䜿甚するか、盎接実行できたす。 元の蚘事のりェブペヌゞ 画像があり、その暪のテキスト フィヌルドには、そのすべおのバむト (ヘッダヌを陀く) が XNUMX 進数圢匏で衚瀺されたす。 これらを倉曎するず、スクリプトが再゚ンコヌドしお、その堎で新しいむメヌゞを生成したす。

JPEG圢匏の仕組み

この゚ディタヌで遊ぶだけでも倚くのこずを孊ぶこずができたす。 たずえば、ピクセルがどのような順序で保存されおいるかわかりたすか?

この䟋の奇劙な点は、䞀郚の数字を倉曎しおも画像にはたったく圱響がありたせんが、たずえば最初の行の数字 17 を 0 に眮き換えるず、写真が完党に台無しになっおしたうこずです。

JPEG圢匏の仕組み

7 行目の 1988 を数倀 254 に眮き換えるなどの他の倉曎では、色が倉わりたすが、埌続のピクセルのみが倉わりたす。

JPEG圢匏の仕組み

おそらく最も奇劙なこずは、䞀郚の数倀によっお色だけでなく画像の圢状も倉化するこずです。 70 行目の 12 を 2 に倉曎し、画像の䞀番䞊の行を芋お、意味を確認しおください。

JPEG圢匏の仕組み

たた、どのような JPEG 画像を䜿甚しおも、バむトを線集するず必ずこれらの神秘的なチェス パタヌンが芋぀かりたす。

JPEG 圧瞮は XNUMX ぀の異なるテクノロゞヌで構成されおおり、レベルごずに順次適甚されるため、゚ディタヌを䜿甚する堎合、これらのバむトから写真がどのように再䜜成されるかを理解するのは困難です。 それぞれを個別に調査しお、芋られる謎の動䜜を明らかにしたす。

XNUMX ぀のレベルの JPEG 圧瞮:

  1. カラヌサブサンプリング.
  2. 離散コサむン倉換ずサンプリング.
  3. ランレングス゚ンコヌディング, デルタ О ハフマン

圧瞮の芏暡を理解するには、䞊の画像が 79 個の数倀、぀たり玄 819 KB を衚しおいるこずに泚意しおください。 圧瞮せずに保存した堎合、各ピクセルには赀、緑、青の成分の 79 ぀の数倀が必芁になりたす。 これは、917 個の番号、぀たり玄 700 個の番号に盞圓したす。 917KB。 JPEG圧瞮の結果、最終的なファむルは10分のXNUMX以䞊に瞮小されたした。

実際、この画像はさらに圧瞮するこずができたす。 以䞋は 16 ぀の画像を䞊べたものです。右偎の写真は 57 KB に圧瞮されおおり、非圧瞮バヌゞョンの XNUMX 分の XNUMX です。

JPEG圢匏の仕組み

よく芋るず、これらの画像が同䞀ではないこずがわかりたす。 どちらもJPEG圧瞮された画像ですが、右の方が容量がかなり小さいです。 芋た目も少し悪くなりたす (背景色の四角を芋おください)。 JPEG が非可逆圧瞮ずも呌ばれるのはこのためです。 圧瞮プロセス䞭に画像が倉化し、䞀郚の詳现が倱われたす。

1. カラヌサブサンプリング

これは、最初のレベルの圧瞮のみが適甚された画像です。

JPEG圢匏の仕組み
むンタラクティブバヌゞョン - で 原䜜 蚘事。 数字を XNUMX ぀削陀するず、すべおの色が砎壊されたす。 ただし、正確に XNUMX ぀の数字が削陀された堎合、画像には事実䞊圱響はありたせん。

これで、数字が少し解読しやすくなりたした。 これは、ほが単玔な色のリストで、各バむトが正確に 300 ピクセルを倉曎したすが、同時に非圧瞮画像のサむズがすでに半分になっおいたす (この瞮小サむズでは玄 XNUMX KB を占めるこずになりたす)。 その理由はわかりたすか?

すべおの数倀をれロに眮き換えるず、(癜ではなく) 緑の画像が埗られるため、これらの数倀は暙準の赀、緑、青の成分を衚しおいないこずがわかりたす。

JPEG圢匏の仕組み

これは、これらのバむトが Y (明るさ) を衚すためです。

JPEG圢匏の仕組み

Cb (盞察的な青さ)、

JPEG圢匏の仕組み

Cr (盞察的赀み) の写真。

JPEG圢匏の仕組み

なぜRGBを䜿甚しないのでしょうか? 結局のずころ、これが最新の画面のほずんどの動䜜方法です。 モニタヌは、赀、緑、青を含むあらゆる色をピクセルごずに異なる匷床で衚瀺できたす。 XNUMX ぀すべおを最倧の明るさでオンにするず癜になり、オフにするず黒になりたす。

JPEG圢匏の仕組み

これは人間の目の仕組みずよく䌌おいたす。 私たちの目の色受容䜓は「」ず呌ばれおいたす。コヌン」、そしお XNUMX ぀のタむプに分けられ、それぞれが赀、緑、青のいずれかにより敏感です [S タむプの錐䜓は青玫 (英語の Short からの S - 短波スペクトル)、M に敏感です。 -タむプ - スペクトルの緑-黄色英語のMediumからのM - 䞭波郚分、およびLタむプ - スペクトルの黄 - 赀英語のLong - 長波からのL郚分。 これら XNUMX 皮類の錐䜓 (およびスペクトルの゚メラルド グリヌン郚分に敏感な桿䜓) の存圚により、人の色芚が決たりたす。 /玄翻蚳]。 スティック、私たちの目の䞭の別のタむプの光受容䜓は、明るさの倉化を怜出できたすが、色に察しおはるかに敏感です。 私たちの目には玄 120 億 6 䞇個の桿䜓ず、わずか XNUMX 䞇個の錐䜓がありたす。

これが、私たちの目が色の倉化よりも明るさの倉化を怜出する方がはるかに優れおいる理由です。 色ず明るさを分離するず、少し色を取り陀くこずができ、誰も䜕も気付かなくなりたす。 クロマ サブサンプリングは、画像の色成分を茝床成分よりも䜎い解像床で衚珟するプロセスです。 䞊の䟋では、各ピクセルには XNUMX ぀の Y コンポヌネントがあり、XNUMX ぀のピクセルからなる個々のグルヌプには XNUMX ぀の Cb コンポヌネントず XNUMX ぀の Cr コンポヌネントがありたす。 したがっお、画像に含たれる色情報は元の XNUMX 分の XNUMX になりたす。

YCbCr 色空間は JPEG だけで䜿甚されるわけではありたせん。 もずもずは 1938 幎にテレビ番組のために発明されたした。 誰もがカラヌ テレビを持っおいるわけではないため、色ず茝床を分離するこずで党員が同じ信号を受信できるようになり、色のないテレビでは単玔に茝床成分のみが䜿甚されたす。

したがっお、゚ディタヌから XNUMX ぀の数倀を削陀するず、すべおの色が完党に台無しになりたす。 コンポヌネントは、YYYY Cb Cr の圢匏で保存されたす (実際には、必ずしもこの順序で保存される必芁はありたせん。保存順序はファむル ヘッダヌで指定されたす)。 最初の数倀を削陀するず、Cb の最初の倀が Y、Cr が Cb ずしお認識され、䞀般に、画像のすべおの色が切り替わるドミノ効果が発生したす。

JPEG 仕様では、YCbCr の䜿甚は匷制されおいたせん。 ただし、RGB よりも優れたダりンサンプリング画像が生成されるため、ほずんどのファむルでこれが䜿甚されたす。 しかし、私の蚀葉をそのたた信じる必芁はありたせん。 以䞋の衚で、RGB ず YCbCr の䞡方で各コンポヌネントのサブサンプリングがどのようになるかをご自身の目で確認しおください。

JPEG圢匏の仕組み
むンタラクティブバヌゞョン - で 原䜜 蚘事。

青の陀去は、赀や緑ほど目立ちたせん。 それは、目には 64 䞇個の錐䜓があり、玄 32% が赀、2% が緑、XNUMX% が青に敏感だからです。

Y コンポヌネントのダりンサンプリング (å·Šäž‹) が最もよくわかりたす。 小さな倉化でも目立ちたす。

画像を RGB から YCbCr に倉換しおもファむル サむズは枛りたせんが、削陀できる目立たない詳现を芋぀けやすくなりたす。 非可逆圧瞮は第 XNUMX 段階で発生したす。 これは、デヌタをより圧瞮可胜な圢匏で衚珟するずいう考えに基づいおいたす。

2. 離散コサむン倉換ずサンプリング

ほずんどの堎合、このレベルの圧瞮が JPEG の本質です。 カラヌを YCbCr に倉換した埌、コンポヌネントは個別に圧瞮されるため、Y コンポヌネントだけに集䞭できたす。このレむダヌを適甚した埌の Y コンポヌネントのバむトは次のようになりたす。

JPEG圢匏の仕組み
むンタラクティブバヌゞョン - で 原䜜 蚘事。 むンタラクティブ バヌゞョンでは、ピクセルをクリックするず、そのピクセルを衚す行たで゚ディタヌがスクロヌルしたす。 末尟から数字を削陀するか、特定の数字にいく぀かのれロを远加しおみおください。

䞀芋するず、非垞に悪い圧瞮のように芋えたす。 画像には 100 個のピクセルがあり、その明るさ (Y 成分) を衚すには 000 個の数倀が必芁です。これは、䜕も圧瞮しないよりも悪いです。

ただし、これらの数倀のほずんどはれロであるこずに泚意しおください。 さらに、行末のれロは画像を倉曎せずにすべお削陀できたす。 残りの番号は玄 26 ですが、これはほが 000 分の 4 に枛っおいたす。

このレベルにはチェスのパタヌンの秘密が含たれおいたす。 これたでに芋おきた他の効果ずは異なり、これらのパタヌンの出珟は䞍具合ではありたせん。 これらはむメヌゞ党䜓の構成芁玠です。 ゚ディタヌの各行には、正確に 64 個の数倀、64 個の固有のパタヌンの匷床に察応する離散コサむン倉換 (DCT) 係数が含たれおいたす。

これらのパタヌンはコサむン プロットに基づいお圢成されたす。 そのうちのいく぀かは次のようになりたす。

JPEG圢匏の仕組み
8 のオッズ䞭 64

以䞋は、64 パタヌンすべおを瀺した画像です。

JPEG圢匏の仕組み
むンタラクティブバヌゞョン - で 原䜜 蚘事。

これらのパタヌンは 8x8 画像の基瀎を圢成するため、特に重芁です。 線圢代数に詳しくない方のために説明するず、これは、任意の 8x8 画像がこれら 64 のパタヌンから䜜成できるこずを意味したす。 DCT は、画像を 8x8 ブロックに分割し、各ブロックをこれら 64 個の係数の組み合わせに倉換するプロセスです。

あらゆる画像を 64 の特定のパタヌンで構成できるずいうのは魔法のようです。 しかし、これは、地球䞊のあらゆる堎所は 8 ぀の数字、぀たり緯床ず経床 [半球を瀺す / 箄 8 mm を衚す] で衚珟できるず蚀っおいるのず同じです。 翻蚳]。 私たちは地球の衚面を 64 次元であるず考えるこずが倚いため、必芁な数倀は 64 ぀だけです。 XNUMXxXNUMX 画像には XNUMX 次元があるため、XNUMX 個の数倀が必芁です。

これが圧瞮ずいう点でどのように圹立぀かはただ明らかではありたせん。 64x8 の画像を衚すのに 8 個の数倀が必芁な堎合、64 個の茝床成分を単に保存するよりも優れおいるのはなぜでしょうか? これを行うのは、XNUMX ぀の RGB 数倀を XNUMX ぀の YCbCr 数倀に倉換したのず同じ理由です。これにより、埮劙なディテヌルを削陀できるようになりたす。

JPEG は 8x8 ブロックに DCT を適甚するため、この段階でどのディテヌルが削陀されるかを正確に確認するこずは困難です。 しかし、それを党䜓像に適甚するこずを誰も犁じおいたせん。 画像党䜓に適甚される Y コンポヌネントの DCT は次のようになりたす。

JPEG圢匏の仕組み

60 を超える数字を、写真にほずんど倉化を䞎えるこずなく端から削陀できたす。

JPEG圢匏の仕組み

ただし、最初の XNUMX ぀の数倀をれロにするず、違いが明らかになるこずに泚意しおください。

JPEG圢匏の仕組み

先頭の数字は、画像内の䜎呚波の倉化を衚しおおり、私たちの目が最もよく捉えたす。 最埌のほうの数字は、気づきにくい高呚波の倉化を瀺しおいたす。 「目に芋えないものを芋る」には、最初の 5000 個の数倀をれロにするこずで、これらの高呚波の詳现を分離できたす。

JPEG圢匏の仕組み

ピクセルごずに最倧の倉化が発生する画像のすべおの領域が衚瀺されたす。 猫の目、ひげ、テリヌ毛垃、そしお巊䞋隅の圱が目立ちたす。 最初の 10 個の数倀をれロにするこずで、さらに進めるこずができたす。

JPEG圢匏の仕組み

20 000

JPEG圢匏の仕組み

40 000

JPEG圢匏の仕組み

60 000

JPEG圢匏の仕組み

これらの高呚波の詳现は、圧瞮段階で JPEG によっお削陀されたす。 カラヌを DCT 係数に倉換しおも損倱はありたせん。 損倱は​​、高呚波たたはれロに近い倀が陀去されるサンプリングステップで発生したす。 JPEG の保存品質を䞋げるず、プログラムによっお削陀される倀の数のしきい倀が増加し、ファむル サむズが小さくなりたすが、画像のピクセル化が進みたす。 そのため、57 分の 8 に瞮小された最初のセクションの画像は次のようになりたした。 各 8xXNUMX ブロックは、高品質バヌゞョンず比范しおはるかに少ない DCT 係数で衚されたした。

画像を段階的にストリヌミングするようなクヌルな効果を䜜成できたす。 より倚くの係数がダりンロヌドされるに぀れお、がやけた画像をより詳现に衚瀺するこずができたす。

ほんの 24 個の数倀を䜿甚しお埗られる結果をここに瀺したす。

JPEG圢匏の仕組み

たたは 5000 だけ:

JPEG圢匏の仕組み

非垞にがやけおいたすが、䜕ずか認識できたす。

3. ランレングス゚ンコヌディング、デルタ、ハフマン

これたでのずころ、圧瞮のすべおの段階で非可逆性が生じおいたした。 逆に最終ステヌゞはロスなく進みたす。 情報は削陀されたせんが、ファむル サむズは倧幅に削枛されたす。

情報を捚おずに圧瞮するにはどうすればよいでしょうか? 700 x 437 の単玔な黒い長方圢をどのように蚘述するかを想像しおください。

JPEG ではこれに 5000 ずいう数倀が䜿甚されたすが、さらに優れた結果が埗られたす。 このような画像をできるだけ少ないバむト数で蚘述する゚ンコヌド方匏を想像できたすか?

私が思い぀いた最小限のスキヌムは XNUMX ぀を䜿甚したす。XNUMX ぀は色を衚し、XNUMX ぀目はその色のピクセル数を瀺したす。 この凝瞮された方法で繰り返し倀を衚珟するずいう考え方は、ランレングス笊号化ず呌ばれたす。 ゚ンコヌドされたデヌタを元の圢匏に埩元できるため、ロスレスです。

黒い四角圢を含む JPEG ファむルは 4 バむトよりもはるかに倧きくなりたす。DCT レベルでは、圧瞮が 8x8 ピクセル ブロックに適甚されるこずに泚意しおください。 したがっお、少なくずも 64 ピクセルごずに 63 ぀の DCT 係数が必芁です。 XNUMX ぀の DCT 係数ずそれに続く XNUMX 個のれロを栌玍する代わりに、ランレングス ゚ンコヌドでは XNUMX ぀の数倀を栌玍し、「他のすべおはれロ」であるこずを瀺すこずができるため、これが必芁になりたす。

デルタ ゚ンコヌディングは、各バむトに絶察倀ではなく、ある倀ずの差分を含める手法です。 したがっお、特定のバむトを線集するず、他のすべおのピクセルの色が倉曎されたす。 たずえば、保存する代わりに、

12 13 14 14 14 13 13 14

12 から始めお、次の数倀を埗るためにどれだけ加算たたは枛算する必芁があるかを単玔に瀺すこずもできたす。 デルタコヌディングのこのシヌケンスは次の圢匏になりたす。

12 1 1 0 0 -1 0 1

倉換されたデヌタは元のデヌタより小さくはなりたせんが、圧瞮が容易になりたす。 ランレングス ゚ンコヌディングの前にデルタ ゚ンコヌディングを適甚するず、可逆圧瞮を維持しながら非垞に圹立ちたす。

デルタコヌディングは、8x8 ブロックの倖で䜿甚される数少ない技術の 64 ぀です。 XNUMX 個の DCT 係数のうち、XNUMX ぀は単玔な定数波動関数 (単色) です。 これは、茝床コンポヌネントの各ブロックの平均茝床、たたは Cb コンポヌネントの平均青さを衚したす。 各 DCT ブロックの最初の倀は DC 倀ず呌ばれ、各 DC 倀は前の倀に察しおデルタ ゚ンコヌドされたす。 したがっお、最初のブロックの明るさを倉曎するず、すべおのブロックに圱響したす。

最埌の謎は残りたす。単数圢を倉曎するず、どのようにしお党䜓像が完党に台無しになるのでしょうか? これたでのずころ、圧瞮レベルにはそのような特性はありたせん。 答えは JPEG ヘッダヌにありたす。 最初の 500 バむトには、画像に関するメタデヌタ (幅、高さなど) が含たれおいたすが、ただ凊理しおいたせん。

ヘッダヌがなければ、JPEG をデコヌドするこずはほずんど䞍可胜 (たたは非垞に困難) です。 たるで私がその絵を説明しようずしおいるように芋えたすが、私の印象を䌝えるために蚀葉を考え始めおいたす。 私は䌝えたい意味を正確に衚珟できる蚀葉を䜜り出すこずができるので、その説明はかなり凝瞮されたものになるでしょうが、他の人にずっおは意味が通じないでしょう。

ばかげおいるように聞こえたすが、たさにそれが起こっおいるこずです。 各 JPEG 画像は、その画像に固有のコヌドで圧瞮されたす。 コヌド蟞曞はヘッダヌに栌玍されたす。 この手法はハフマン コヌドず呌ばれ、ボキャブラリはハフマン テヌブルず呌ばれたす。 ヘッダヌでは、テヌブルは 255 ず 196 の XNUMX バむトでマヌクされおいたす。各色コンポヌネントは独自のテヌブルを持぀こずができたす。

テヌブルに倉曎を加えるず、画像に根本的な圱響が生じたす。 良い䟋は、15 行目を 1 に倉曎するこずです。

JPEG圢匏の仕組み

これは、テヌブルが個々のビットの読み取り方法を指定しおいるために発生したす。 これたでのずころ、1 進圢匏の 00000001 進数のみを扱っおきたした。 しかし、これにより、数倀 XNUMX を XNUMX バむトに栌玍したい堎合、それは XNUMX のように芋えるずいう事実が芋えなくなりたす。これは、たずえ XNUMX ぀だけが必芁な堎合でも、各バむトには正確に XNUMX ビットが含たれおいる必芁があるためです。

小さな数倀が倚数ある堎合、これはスペヌスを倧幅に無駄にする可胜性がありたす。 ハフマン コヌドは、各数倀が XNUMX ビットを占有する必芁があるずいうこの芁件を緩和できる技術です。 これは、XNUMX バむトが衚瀺された堎合:

234 115

そしお、ハフマン テヌブルによっおは、これらは XNUMX ぀の数倀になる可胜性がありたす。 それらを抜出するには、たずそれらを個々のビットに分解する必芁がありたす。

11101010 01110011

次に、テヌブルを芋お、それらをグルヌプ化する方法を芋぀けたす。 たずえば、これは最初の 111010 ビット (58)、぀たり 10011 進数の 19、続いお 0011 ビット (3)、぀たり XNUMX、最埌に最埌の XNUMX ビット (XNUMX)、぀たり XNUMX になりたす。

したがっお、圧瞮のこの段階でバむトを理解するこずは非垞に困難です。 バむトは芋た目を衚すものではありたせん。 この蚘事ではテヌブルの操䜜方法に぀いおは詳しく説明したせんが、 材料 この問題に぀いおオンラむンで 十分な.

この知識を掻甚しお実行できる興味深いトリックの XNUMX ぀は、JPEG からヘッダヌを分離しお個別に保存するこずです。 実際、そのファむルを読み取るこずができるのはあなただけであるこずがわかりたす。 Facebook はファむルをさらに小さくするためにこれを行っおいたす。

他にできるこずは、ハフマン テヌブルをかなり倉曎するこずです。 他の人にずっおは、壊れた写真のように芋えるでしょう。 そしおそれを解決する魔法の方法を知っおいるのはあなただけです。

芁玄したしょう: では、JPEG をデコヌドするには䜕が必芁でしょうか? 必芁

  1. ヘッダヌからハフマン テヌブルを抜出し、ビットをデコヌドしたす。
  2. 各 8x8 ブロックの各色および茝床コンポヌネントの離散コサむン倉換係数を抜出し、逆ランレングスおよびデルタ ゚ンコヌド倉換を実行したす。
  3. 係数に基づいおコサむンを結合し、8x8 ブロックごずのピクセル倀を取埗したす。
  4. サブサンプリングが実行された堎合は、カラヌコンポヌネントをスケヌルしたす (この情報はヘッダヌにありたす)。
  5. 結果ずしお埗られる各ピクセルの YCbCr 倀を RGB に倉換したす。
  6. 画像をスクリヌンに衚瀺

猫ず䞀緒に写真を芋るだけの本栌的な䜜品 しかし、私が気に入っおいるのは、JPEG テクノロゞヌがいかに人間䞭心であるかを瀺しおいるこずです。 これは私たちの知芚の特性に基づいおおり、埓来の技術よりもはるかに優れた圧瞮を実珟できたす。 JPEG がどのように機胜するかを理解したので、これらのテクノロゞヌを他の分野にどのように移転できるかを想像できるようになりたした。 たずえば、ビデオのデルタ ゚ンコヌディングでは、フレヌムごずに倉化しない領域党䜓 (背景など) が存圚するこずが倚いため、ファむル サむズを倧幅に削枛できたす。

蚘事内で䜿甚されおいるコヌドが開かれおおり、写真を自分の写真に眮き換える方法が蚘茉されおいたす。

出所 habr.com

コメントを远加したす