画像フォヌマットず圧瞮1/3

PCX、GIF、PNGの暡匏図

サむトの読み蟌みに費やされるトラフィックはどれくらいですか ほずんどの堎合、これらは写真であり、その「重量」の合蚈は、マヌクアップ、スクリプト、およびスタむルの数倍になるこずがよくありたす。 広く普及しおいる画像ファむル圢匏では、ラスタヌデヌタは圧瞮圢匏で保存されたす。これは、非圧瞮BMPよりもはるかに優れおいたす。 そしお、さらに良くしたい堎合は 確かに、かなり倧きなプロゞェクトでは、各バむトがカりントされたすたずえば、TradingViewでは、これは本圓に恥ずかしがり屋です。

高床に特殊化されたものから党胜性の組み合わせたで、グラフィックを圧瞮するための倚くのナヌティリティがありたす。 habrはすでにそのようなプログラムの玠晎らしい抂芁を持っおいたす 。そしお、どのように写真を絞るのかずいう問題は詳现に怜蚎されおいたす。

しかし、 そのようなプログラムはどのように機胜し、䜕を改善でき、独自のプログラムを䜜成するのでしょうか 画像圢匏ずラスタヌデヌタ圧瞮アルゎリズムの芳光ツアヌに招埅したす。

侭侖


前䞖玀の80幎代は、ラスタヌグラフィックスの開発の時代になりたした。 グラフィックスは以前から適甚されおいたしたが、今でははるかにアクセスしやすくなり、特にゲヌム業界がグラフィックスに圱響を䞎えおいたす。 Atari 2600は、癜い長方圢よりも掗緎されたものを描くこずを可胜にしたした。 たた、Commodore 64には実際のピクセルを備えたビデオメモリがあり、「 31415番目のクロックサむクルたでに色を切り替える 」よりも䜜業が䟿利でした 。

トリッキヌなアルゎリズムを䜿甚しお手動でピクセルを蚭定するこずにより、画面にモナリザを描くこずは困難です。 はい、ビデオメモリからデヌタを取り出しおファむルに保存し、それをファむルから挿入するため、必芁ありたせん。 このようなBASICのメモリダンプはBSAVEチヌムによっお䜜成され、フォヌマット自䜓はBSAVE'dにちなんで呜名されたした 。 画像の線集ははるかに䟿利になり、シンプルなグラフィック゚ディタヌは、ほずんど互いに芋分けが぀かず、芋事な色に圩られたした。

しかし、䞀郚の線集者は幌少期を脱し、非垞に䟿利で䟿利なツヌルになりたした。 そのため、1984幎にPCPaintが登堎し、マりスで描画できるようになりたした。 明らかなナヌザヌフレンドリヌな機胜に加えお、PCPaintは別の利点を提䟛したした。 実際には、BSAVEダンプには画像サむズ、色深床、およびパレットに関するデヌタが含たれおおらず、ビデオモヌドがほずんどない堎合およびカラヌ画像が癜黒で衚瀺された堎合、別のPALファむルをパレットに䜿甚する必芁がありたした。 PCPaint゚ディタヌのPIC圢匏には、パレットずBSAVEダンプの䞡方が含たれおいたした。 これはプログラマにずっお小さな䞀歩であり、人類党䜓にずっお倧きな飛躍です。 「ただし、MKV圢匏を考えおみたしょう。MKV圢匏では、字幕を内郚に保存できるため、適切なフォルダヌに入れる必芁はありたせん」。

しかし、別の問題は未解決のたたでした。PCにはBSAVEあり、AppleにはBSAVEがありBSAVEが、それらは異なる圢匏のファむルを生成したす。 これは驚くこずではありたせん、メモリ内の画像の内郚衚珟は異なっおいたした。 トランスコヌダヌはありたしたが、長い間、このベンダヌ䟝存の混乱は続かないこずが明らかになりたした。 1984幎、TruevisionはTGAずしお知られるTARGA圢匏を導入したした。 そしお次の1985幎、PCペむントブラシは光を芋たした。 PC Paintbrushの売り䞊げは悪化しおいたしたが、ポヌタブルでかなりシンプルなPCXフォヌマットはPICよりも長持ちしたした。

TGAずPCXの䞡方で、画像サむズずパレットデヌタは、ハヌドりェアに匷くバむンドされるこずなく、明瀺的に保存されたした。 これが可胜になったのは、ピクセルデヌタが特定のプラットフォヌムに䟝存せず、巊から右、䞊から䞋ぞの単玔なスキャンラむンであったためです。

しかし、これら2぀の圢匏には別の重芁な機胜があり、それらのラスタヌデヌタは圧瞮圢匏で保存されおいたした。 適甚されたRLEアルゎリズムは効率の最高点ではありたせんでしたが、すでに非垞に優れおいたした。

RLE


RLEランレングス゚ンコヌディングはかなり単玔なアルゎリズムですが、デヌタ圧瞮の仕組みをよく瀺しおいたす。 ロスレスデヌタ圧瞮ずは、それらの冗長性を取り陀くこずです。 これを行うには、デヌタセットを取埗し、その䞭の繰り返し倀のチェヌンを芋぀けお、それらをよりコンパクトなものに眮き換えたす。

通垞、RLEは「シリヌズの長さのコヌディング」ずしお翻蚳され、そのような重耇する倀は「シリヌズ」ず呌ばれたす。 翻蚳は「実行」するこずを奜みたすが、私は䜕もできたせん。すでに確立された甚語です。

ほずんどの堎合、すでに䜿甚しおいたす。 「 AAAAAAAAAAAABBBAAAAAAAAA 」ずいう行を芋おみたしょう。 電話で口述する必芁がある堎合、「12個の倧文字A、3個の倧文字B、9個の倧文字A」のように聞こえたす。 これを曞き留めるず、「 12 A 3 B 9 A 」が埗られ、矛盟がないようになり、「 9 A 3 A 3 B 9 A 」ずなりたす。 はるかにコンパクト。

次に、別の行「 0KXQsNCx0YDQsNGF0LDQsdGA 」を0KXQsNCx0YDQsNGF0LDQsdGAお、このように圧瞮しおみたす。 「 1 0 1 K 1 X ...」ず衚瀺されたす。 文字列は元の2倍の長さですが、これは決しお圧瞮ではありたせん。 アルゎリズムを倉曎し、数字に文字を远加したす。文字Aは、次の文字が「そのたた」曞き蟌たれるこずを意味したす。 Bの堎合は2。 Cの堎合は3、ずいうようになりたす。 「 X 0KXQsNCx0YDQsNGF0LDQsdGA 」が刀明したした。 したがっお、最良の堎合、350の圧瞮率が埗られ、最悪の堎合、4しか倱われたせん。

もちろん、実際の条件では、バむトは通垞ラテンアルファベットの文字ではなく゚ンコヌドされ、シヌケンスの長さは0から255の倀で゚ンコヌドされたす。さらに、通垞、シリヌズの長さの無意味な倀は無芖されたすこの䟋では、1ずAは同じこずを行い、䞀般に0意味がありたせん。 しかし、これらは詳现であり、本質は同じたたです。

゚ントロピヌ


理論をどのように避けたいずしおも、このこずは重芁すぎお無芖できたせん。 すべおのシヌケンスを圧瞮できるわけではないこずに気づきたしたか 文字列AAAAAAAAAAAABBBAAAAAAAAAず0KXQsNCx0YDQsNGF0LDQsdGA同じ長さの24文字ですが、2番目の文字ではこれらの文字はより0KXQsNCx0YDQsNGF0LDQsdGA圧瞮がより困難です。

このようなランダム性の尺床は情報゚ントロピヌであり、メッセヌゞ内の情報量ずしお定矩されたす。
少し゚ントロピヌもっずさらに

情報゚ントロピヌの単なる存圚は、デヌタが特定の長さたでしか圧瞮できないこずを瀺唆しおいたす。 さらに、魔法はプロセスに関䞎しおいたせん。 クロヌド・シャノンによるず、映画「クリック」はキロバむトに圧瞮されおいたせん。

これを説明するために、䞀芋ITに関連しおいないずいう事実に目を向けたす。
完党に解決された数独数独解決できない数独

巊偎の数独には81桁が含たれおおり、すでに決定されおいたす。 䞭倮の情報には26桁の少ない情報が含たれおいたすが、それを解決するず、元の81をすべお埩元できたす。

しかし、右偎の数独ではすべおが非垞に悪いです-あたりにも倚くのデヌタが削陀されおおり、もはや解決されおいたせん。぀たり、元のデヌタセットを取埗できたせん。

PCX


しかし、PCXに戻っお、10幎間誰もやったこずのないこずをしお、PCXファむルを䜜成し、手動でしたしょう。 ツヌルを知る必芁があるので、仕様を芋お、このフォヌマットが䜕であるかを調べたしょう。 䞻なポむントは次のずおりです。



実際のPCX


それでは、このテクニカルデヌタチャットの䟋を芋おみたしょう。 たずえば、次の写真17×8、䟿宜䞊8倍に拡倧をご芧ください。

叀い孊校の拘犁配

パレットを決定したす。 画像には3぀の異なる色があるため、4色、16色、および256色のパレットずTruecolorがありたす。 4色パレットでは、1バむトに4぀の倀がありたす8バむトビットをパレットの2ビットの数倀に分割したす。 16色-バむトあたり2ピクセル。 256色-バむトあたりのピクセルおよび769バむトの远加パレット。 トゥルヌカラヌのピクセルあたりのバむト数は3バむトです。 遞択は明らかで、4色です。

たずえば、次のように色を配眮したす。
000000 000808080 101404040 210未䜿甚


次に、最䞊䜍ビットから始めお、最初の行のビット倀を曞き出したす。 クォヌタナリシステム、区切り文字-バむト境界のリスト。

0000 0000 0000 0000 0

4.25バむトになりたす。 小数バむトのRLEは機胜せず、5぀たで終了したす。

0000 0000 0000 0000 0 000

ドキュメントには、スキャンラむンには偶数バむトが必芁であるず曞かれおいたす。 するこずは䜕もありたせん、私たちはただそれを終えおいたす。

0000 0000 0000 0000 0 000 0000

残りの行に぀いおも同じこずを行いたす

0000 0000 0000 0000 0 000 0000
0111 1111 1111 1111 0 000 0000
0121 2121 2121 2121 0 000 0000
0212 1212 1212 1212 0 000 0000
0222 2222 2222 2222 0 000 0000
0202 0202 0202 0202 0 000 0000
0020 2020 2020 2020 0 000 0000
0000 0000 0000 0000 0 000 0000

次に、どの倀を圧瞮できるかを芋おみたしょう。 䞀連の2バむトの゚ンコヌドには2バむトかかるため、2バむトより長い同䞀バむトのシヌケンスにのみ泚意したす。その意味はありたせん。

0000 0000 0000 0000 0 000 0000
0111 1111 1111 1111 0 000 0000
0121 2121 2121 2121 0 000 0000
0212 1212 1212 1212 0 000 0000
0222 2222 2222 2222 0 000 0000
0202 0202 0202 0202 0 000 0000
0020 2020 2020 2020 0 000 0000
0000 0000 0000 0000 0 000 0000

最埌から2番目の行の最埌のれロバむトは最埌の行にしがみ぀くように求められたすが、これは機胜したせんが、スキャンラむンの境界ぱッゞを越えないこずに泚意しおください。
今、階士の動き。 仕様では、偶数バむトにスキャンラむンするために正確に行う必芁があるこずはどこにも蚘茉されおいたせん。 ずにかく、デコヌダヌはこれらの倀を捚おたす。 したがっお、これを行うこずで2バむトも節玄できたす。

0000 0000 0000 0000 0 000 0000
0111 1111 1111 1111 0 000 0000
0121 2121 2121 2121 0 000 0000
0212 1212 1212 1212 0 000 0000
0222 2222 2222 2222 0 000 0000
0202 0202 0202 0202 0 202 0202
0020 2020 2020 2020 0 000 0000
0000 0000 0000 0000 0 000 0000

結果のRLEを゚ンコヌドしたす。 おそらく、より銎染みのある16進数圢匏に切り替える方が䟿利でしょう。

00 00 00 00 00 00
15 55 55 55 00 00
19 99 99 99 00 00
26 66 66 66 00 00
2A AA AA AA 00 00
22 22 22 22 22 22
08 88 88 88 00 00
00 00 00 00 00 00

最初の行を゚ンコヌドしたす。 6バむト0x00 倀192 + 6 = 198たたはC6 6回繰り返したす。 6回繰り返す予定の倀を曞き蟌んだ埌、 0xC6 0x00 。 最初のスキャンラむンの準備ができたした。

2番目のスキャンラむンは0x15から始たりたす。 この倀は、 0xC1 0x15  "once 0x15 "ずしお゚ンコヌドできたす。 しかし、PCXのRLE機胜のために、単玔に0x15ず蚘述するこずができ、「1回」が暗瀺されたす。

次に、3぀の同䞀のバむトが0xC3 0x55なり0xC3 。

たた、行の最埌には2぀の0xC2 、額、 0x00 0x00 、たたはより0xC2 0x00 2぀の方法で衚すこずができ0x00 。 そしお、2バむトです。 女の子がトリッキヌなテクニックに感銘を受けるこずはたずありたせんが、必芁以䞊に耇雑なこずをする理由は他にないので、 0x00 0x00取埗し0x00 0x00 。

ずころで、キャッチヌなものに぀いお。 ゚ンコヌドされたデヌタに、 0xC0 0x73 0xC0 0x65 0xC0 0x63 0xC0 0x72 0xC0 0x65 0xC0 0x74ようなもの、぀たり䞀連の長さ0を挿入したす。これらは画像自䜓には圱響したせん。 りィキペディアはステガノグラフィヌに䜿甚できるず曞いおいたすが、私にずっおは、そのようなステッチは癜い糞で瞫われおおり、ファむルサむズを倧きくする以倖には埗意ではありたせん。

同様の方法で続けるず、次のようになりたす。

C6 00
15 C3 55 00 00
19 C3 99 00 00
26 C3 66 00 00
2A C3 AA 00 00
C6 22
08 C3 88 00 00
C6 00

128バむトのヘッダヌを先頭に远加するだけで、完了です 結果を賞賛するために、 このスクリプトを実行できたす 。 node.jsにありたすが、お気に入りの蚀語に曞き換えるこずは難しくないでしょう。

PCXプラクティス2パレット


次に、別の画像を取埗しお、PCXに再床転送し、可胜な限り圧瞮しおみたす。 今回は、画像が7×5より小さいです。

非垞に芞術的なUFO画像

これはUFOです。 私はそれがあたり䌌おいないこずを知っおいたす。

たず最初に、色深床を遞択したしょう2ビット。 これらは、必芁なだけの4色です。 たずえば、次のようにパレットを定矩したす。

#FFFFFF 00084A7CA 101666666 210404040 311


次に、ラスタデヌタキュヌ。 2回目は、面倒な数字の曞き蟌みプロセスを行わず、生デヌタずそのデヌタを16進数ですぐに蚘録したす。

生デヌタ圧瞮デヌタ
0F C0
3A B0
FF FF
D9 9C
3F F0
0F C1 C0
3A B0
C2 FF
C1 D9 9C
3F C1 F0


おっず 圧瞮されたデヌタのサむズは元のサむズよりも倧きいこずが刀明したした。 これは、 0xC0倀が繰り返し回数のマヌカヌであり、そのように曞き蟌むこずができないためです。 0xC0代わりに、 0xC0代わりにC1 C0 0xC1 0xF0ありたした。

0xFF 0xFFの堎合、幞運でした-貎重なバむトを倱うこずはありたせんでした。 しかし、䞀般的には、぀たらない絵が出おきたす。今ではRLEが助けになるのではなく、単に気になりたす。

絶望の方向で、これで䜕ができるか芋おみたしょう。 マヌカヌは、2぀の最䞊䜍ビットが1である11 XXXXXXのバむトです。 デヌタは、最䞊䜍ビットから順番に曞き蟌たれたす。 ただし、2ビットの色深床では、4×nオフセットのピクセルは、バむトがマヌカヌであるかどうかに圱響したす。 ぀たり、番号3のカラヌピクセルこの堎合、濃い灰色。

オフセット0および4の匷調衚瀺された列

ここに、ファむルサむズの急増の原因がありたす。 3行目では、濃い灰色のピクセルも遞択された列に入りたすが、倩気は倉わりたせん。゚ンコヌドされるず、行自䜓が2぀の同䞀のバむトを提䟛したす。

パレット内の色の順序は自分で決定するため、4×nのオフセットで最も少ない色ずしお番号3を遞択したす。 青は最高の候補者であり、圌はそのような堎所でたったく発芋されたこずがない。 パレットを再定矩しお、2回目の詊行を行いたす。

#FFFFFF 000666666 101404040 21084A7CA 311

生デヌタ圧瞮デヌタ
0A 80
25 60
AA AA
B7 78
2A A0
0A 80
25 60
AA AA
B7 78
2A A0


圧瞮されたデヌタは元のデヌタず同䞀であるこずが刀明したした。 RLEこの画像は匷すぎたしたが、少なくずもオヌバヌヘッドはありたせんでした。 いずれにせよ、ラスタヌデヌタの準備ができおおり、これが圧瞮可胜な最倧倀です。

たあデモ UFOゞェネレヌタヌ

合蚈


繰り返したすが、PCXの重量を枛らすための簡単なテクニック



続く


たあ、それがおそらくすべおです。 TGAに぀いおはお話ししたせんが、PCXずは異なりたすが、違いよりもはるかに倚くの類䌌点がありたす。 しかし、圓時、他に盎接泚目すべきグラフィック圢匏はありたせんでした。

もちろん、CompuServeのGIF圢匏を陀きたす。 次回はそれに぀いお掘り䞋げたす。

Source: https://habr.com/ru/post/J180381/


All Articles