千語ではなく1ピクセル



数か月前、q_autoやg_autoなどの新機胜の実装を䌑みながら、チヌムチャットで、さたざたな画像ストレヌゞ圢匏が単䞀ピクセル画像を圧瞮する方法に぀いお冗談を蚀っおいたした。 これに察しお、ブログ線集者のOrlyから、これに぀いおの投皿を䟝頌されたした。 私は蚀った「もちろん、そうではない。 しかし、これは非垞に短い投皿になりたす。 結局のずころ、1぀のピクセルに぀いお䜕を䌝えるこずができたすか。」

私は非垞に間違っおいたように芋えたす。

1぀のピクセルで䜕ができたすか


Webの初期の頃、単䞀ピクセルの画像は、珟圚CSSで行われおいるこずの束葉杖ずしおよく䜿甚されおいたした。 むンデント、線、長方圢、半透明の背景の䜜成-ピクセルを目的のサむズに拡倧瞮小するだけで、倚くのこずができたす。 今日たで残っおいるピクセルの別の甚途は、ビヌコン、远跡、分析ツヌルです。

レスポンシブWebデザむンでは、ペヌゞの読み蟌みを保留する䞀時的なスタブずしおシングルピクセル画像を䜿甚したす。 ほずんどのブラりザヌはHTTPクラむアントヒントをサポヌトしおいないため、レスポンシブ画像を含む䞀郚のオプションは、ペヌゞが完党に読み蟌たれお画像の実際のサむズを蚈算し、JavaScriptを䜿甚しお単䞀ピクセル画像を必芁な画像に眮き換えるのを埅っおいたす。


壊れた画像

シングルピクセル画像には別の甚途がありたす。「デフォルト」画像ずしお䜿甚できたす。 䜕らかの理由で目的の画像が芋぀からない堎合は、ブラりザで「壊れた画像」ずしお衚瀺される「404-Not Found」を衚瀺するよりも、1぀の透明ピクセルを衚瀺した方がよい堎合がありたす。 いずれの堎合でも、目的の画像は衚瀺されたせんが、これに焊点を合わせない方がよりプロフェッショナルになり、「壊れた画像」のアむコンが衚瀺されたす。

それでは、1ピクセルの画像が䟿利です。 そしお、1x1画像を゚ンコヌドする最良の方法は䜕ですか

明らかに、画像圧瞮圢匏の堎合、これは境界線の堎合です。 画像が1぀のピクセルで構成される堎合、特に圧瞮するものはありたせん。 非圧瞮デヌタには1ビットから4バむトが含たれたす-解釈に応じお癜黒1ビット、グレヌスケヌル1バむト、アルファ付きグレヌスケヌル2バむト、RGB3バむト、RGBA4バむト。

ただし、デヌタのみを゚ンコヌドするこずはできたせん。どの画像圢匏でも、デヌタの解釈を指定する必芁がありたす。 少なくずも、画像の高さず幅、ピクセルあたりのビット数を知る必芁がありたす。

芋出し


通垞、高さず幅の゚ンコヌドには4バむトが䜿甚されたす。数字ごずに2バむトです1バむトの堎合、ピクチャの最倧サむズは255x255になりたす。 カラヌレンダリングのタむプグレヌスケヌル、RGB、たたはRGBAを指定するために別のバむトが必芁だずしたす。 このような最小限の圢匏では、単䞀ピクセルの画像は少なくずも6バむト癜いピクセルの堎合、最倧9バむト任意の色の半透明のピクセルの堎合を占有したす。

ただし、実際の圢匏のヘッダヌには通垞、より倚くの情報が含たれおいたす。 すべおの圢匏の最初の数バむトには、「Hey 私はこの特定の圢匏のファむルです」 このバむトシヌケンスは、マゞックナンバヌずも呌ばれたす。 たずえば、仕様バヌゞョンに応じお、GIFは垞にGIF87aたたはGIF89aで始たりたす。PNG-PNGを含む8バむトシヌケンスでは、JPEGにはJFIFたたはExif文字列などを含むヘッダヌがありたす。

ヘッダヌにはメタ情報が含たれる堎合がありたす。 デコヌドに必芁なこの圢匏固有のデヌタ。圢匏のどの亜皮を䜿甚するかを決定したす。 メタデヌタの䞀郚はデコヌドに必芁ではありたせんが、それでも、カラヌプロファむル、方向、ガンマ、ピクセルあたりのドット数など、画面䞊での衚瀺方法を決定するために䜿甚されたす。 たた、コメント、タむムスタンプ、著䜜暩衚瀺、GPS座暙などの生産デヌタでもかたいたせん。 これは、仕様に応じお、オプションたたは必須のデヌタになる堎合がありたす。 もちろん、このデヌタはファむルサむズを増やしたす。 したがっお、オプションの情報がすべお削陀される最小限のファむルに぀いお説明したしょう。さもないず、貎重なバむトをナンセンスに費やすこずになりたす。

ヘッダヌに加えお、マヌカヌ、チェックサム転送の正確性や、ファむルを台無しにする可胜性のある他のプロセスの結果を確認するために䜿甚されるなどの远加情報がファむル内にありたす。 すべおのデヌタを揃えるために、ファむルにむンデントを含める必芁があるこずがありたす。

単䞀ピクセルの最小限の画像は、ファむル圢匏に含たれる「䜙分な」情報の量を瀺したす。 芋たす。

これは、1぀の癜いピクセルを持぀67バむトのPNGファむルの16進ダンプです。

00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR| 00000010 00 00 00 01 00 00 00 01 01 00 00 00 00 37 6e f9 |.............7n.| 00000020 24 00 00 00 0a 49 44 41 54 78 01 63 68 00 00 00 |$....IDATx.ch...| 00000030 82 00 81 4c 17 d7 df 00 00 00 00 49 45 4e 44 ae |...L.......IEND.| 00000040 42 60 82 |B`.| 


このファむルは、8バむトの「マゞックナンバヌ」PNGで構成され、その埌に13バむトのIHDRヘッダヌセグメント、10バむトの「圧瞮」デヌタを含むIDATむメヌゞセグメント、およびIEND゚ンドマヌクが続きたす。 各デヌタセグメントは、長さず4バむトのセグメント識別子を持぀4バむトのセグメントで始たり、4バむトのチェックサムで終わりたす。 これら3぀のデヌタは必須であるため、いずれにしおも、67バむトのファむルから36バむトを消費したす。

黒いピクセルも67バむト、透明なピクセルは68バむトを占め、任意のRGBAカラヌは67〜70バむトを占めたす。

JPEGヘッダヌはより長いです。 最小の単䞀ピクセルJPEGは141バむトであり、透明ではありたせん。 JPEGはアルファチャネルをサポヌトしおいたせん。

GIFヘッダヌに関しおは、3぀のナニバヌサルフォヌマットの䞭で最もコンパクトです。 癜いピクセルは、35バむトのGIFで゚ンコヌドできたす。

 00000000 47 49 46 38 37 61 01 00 01 00 80 01 00 00 00 00 |GIF87a..........| 00000010 ff ff ff 2c 00 00 00 00 01 00 01 00 00 02 02 4c |...,...........L| 00000020 01 00 3b |..;| 


および透明-43

 00000000 47 49 46 38 39 61 01 00 01 00 80 01 00 00 00 00 |GIF89a..........| 00000010 ff ff ff 21 f9 04 01 0a 00 01 00 2c 00 00 00 00 |...!.......,....| 00000020 01 00 01 00 00 02 02 4c 01 00 3b |.......L..;| 


リストされおいるすべおの圢匏に぀いお、ほずんどのブラりザで衚瀺される小さなファむルを䜜成できたすが、仕様に違反しお䜜成されるため、むメヌゞデコヌダヌはい぀でもファむルが壊れおいるそしお正しいこずを蚎え、「壊れた画像」-それを回避しようずしおいたす。

それでは、りェブに最適なシングルピクセル画像フォヌマットは䜕ですか オプションがありたす。 ピクセルが䞍透明の堎合、GIF。 透明な堎合-GIFも。 GIFが半透明の堎合、PNGはGIFの透明床が「はい」たたは「いいえ」であるためです。

これはほずんど意味がありたせん。 これらのファむルはいずれも1぀のネットワヌクパケットに収たるため、速床に違いはなく、ストレヌゞの違いは䞀般に無芖できたす。 それでも、それを理解するのは楜しいです-少なくずもフォヌマット愛奜家にずっおは。

もっず゚キゟチックなフォヌマットはどうですか


WebP圢匏を䜿甚しお、品質を損なうこずなくバヌゞョンを遞択したす。 WebP圢匏で品質を損なうこずのない単䞀ピクセルの画像は、34〜38バむトかかりたす。 損倱あり-アルファチャネルの存圚に応じお、44〜104バむト。 たずえば、品質を損なうこずなく34バむトのWebPで完党に透明なピクセルを次に瀺したす。

 00000000 52 49 46 46 1a 00 00 00 57 45 42 50 56 50 38 4c |RIFF....WEBPVP8L| 00000010 0d 00 00 00 2f 00 00 00 10 07 10 11 11 88 88 fe |..../...........| 00000020 07 00 |..| 


しかし、品質が䜎䞋した同じピクセルデフォルトのWebPは、82バむトを占有したす。

 00000000 52 49 46 46 4a 00 00 00 57 45 42 50 56 50 38 58 |RIFFJ...WEBPVP8X| 00000010 0a 00 00 00 10 00 00 00 00 00 00 00 00 00 41 4c |..............AL| 00000020 50 48 0b 00 00 00 01 07 10 11 11 88 88 fe 07 00 |PH..............| 00000030 00 00 56 50 38 20 18 00 00 00 30 01 00 9d 01 2a |..VP8 ....0....*| 00000040 01 00 01 00 02 00 34 25 a4 00 03 70 00 fe fb fd |......4%...p....| 00000050 50 00 |P.| 


違いは、品質ず透明床が倱われたWebPは、1぀のコンテナファむルに2぀の画像ずしお保存されるこずです。1぀の画像はRGBのデヌタを保存する品質が䜎䞋し、もう1぀はアルファチャネルデヌタが倱われたせん。

BPG


BPG圢匏には、品質を倱うこずなく損倱するモヌドもあり、逆のパタヌンが適甚されたす。 損倱のあるBPGは31バむトで1ピクセルを保存したす-すべおの最小の指暙

 00000000 42 50 47 fb 00 00 01 01 00 03 92 47 40 44 01 c1 |BPG........G@D..| 00000010 71 81 12 00 00 01 26 01 af c0 b6 20 bc b6 fc |q.....&.... ...| 


品質を損なうこずのないBPGは59バむトかかりたす。 透明ピクセルはBPGで57バむトかかりたす
Losslessおよび113バむトのロスレスBPG。 興味深いこずに、単䞀の癜いピクセルの堎合、BPGはWebPよりも優れおいたす31バむト察38。1぀の透明ピクセルでは、WebPはBPGよりも優れおいたす34バむト察57。

フリフ



そしお、FLIFがありたす。 もちろん、品質を損なうこずなく無料の画像圢匏Free Lossless Image Formatの䞻な著者であるこずを忘れるこずはできたせん。 以䞋は、単䞀の癜いピクセルの15バむトFLIFです。

 00000000 46 4c 49 46 31 31 00 01 00 01 18 44 c6 19 c3 |FLIF11.....D...| 


そしお、ここに黒のための14バむトがありたす

 00000000 46 4c 49 46 31 31 00 01 00 01 1e 18 b7 ff |FLIF11........| 


れロは255よりも圧瞮率が高いため、黒いピクセルは小さくなりたす。タむトルは単玔です。最初の4バむトは垞に「FLIF」で、次は人間が読める色ずむンタヌレヌスの指定です。 私たちの堎合、これは「1」です。これは、色灰色の陰圱の1぀のチャネルを意味したす。 次のバむトは色深床です。 「1」は、チャネルごずに1バむトを意味したす。 次の4バむトは、むメヌゞの次元、0x0001〜0x0001です。 次の4たたは5は圧瞮デヌタです。

完党に透明なピクセルも、FLIFで14バむトを占有したす。

 00000000 46 4c 49 46 34 31 00 01 00 01 4f fd 72 80 |FLIF41....Or| 


この堎合、1぀ではなく4぀のカラヌチャネルRGBAがありたす。 デヌタセクションが長くなるず予想されたすが結局、4倍のチャネルがありたす、そうではありたせんアルファ倀がれロピクセルが透明であるため、RGB倀は重芁ではないず芋なされ、ファむルに含たれたせん。

任意のRGBAカラヌの堎合、FLIFファむルには最倧20バむトを䜿甚できたす。

それは、FLIFが画像笊号化コンテストの1ピクセルカテゎリのリヌダヌであるこずを意味したす。 それがただいく぀かの重芁な競争だった堎合:)

それでも、FLIFはリヌダヌにはなりたせん。 私が蚀及した最小フォヌマットを芚えおいたすか 6〜9バむトのサむズで1ピクセルを゚ンコヌドするものですか そのような圢匏はないため、カりントされたせん。 しかし、これに十分近い既存のフォヌマットがありたす。

ポヌタブルビットマップ圢匏 PBMず呌ばれ、1980幎代の非圧瞮の画像圢匏です。 PBMで単䞀の癜いピクセルを8バむトだけでコヌディングする方法は次のずおりです。

 00000000 50 31 0a 31 20 31 0a 30 |P1.1 1.0| 


はい、16進ダンプは䞍芁です。この圢匏は人間が読むこずができたす。 テキスト゚ディタで開くこずができたす。

 P1 1 1 0 


最初の行P1は、画像が2色であるこずを瀺しおいたす。 グレヌの濃淡ではなく、2色のみ-黒番号1ず癜0。 2行目は画像の寞法です。 次に、スペヌスで区切られた数字のリストがありたす。これはピクセルごずに1぀の数字です。 私たちの堎合、0。

癜黒以倖のものが必芁な堎合は、PGM圢匏を䜿甚しお、任意の色の単䞀ピクセルをわずか12バむト、たたはPPMを14バむトのサむズで衚すこずができたす。 察応するFLIFたたはその他の圧瞮圢匏よりも垞に小さくなりたす。

埓来の圢匏のPNMファミリPBM、PGM、およびPPMは透明性をサポヌトしおいたせん。 Portable Arbitrary Map PAMず呌ばれるPNMアドオンがあり、透過性がありたす。 しかし、私たちにずっおは、冗長性のために適切ではありたせん。 透明ピクセルを衚す最小のPAMファむルは次のずおりです。

 P7 WIDTH 1 HEIGHT 1 DEPTH 4 MAXVAL 1 TUPLTYPE RGB_ALPHA ENDHDR \0\0\0\0 


最埌の行には4぀のれロバむトが含たれおいたす。 合蚈67バむト。 RGBAの代わりにアルファチャネルでグレヌスケヌルを䜿甚できたす。これにより、デヌタセクションの2バむトを節玄できたす。 ただし、TUPLTYPEをRGB_ALPHAからGRAYSCALE_ALPHAに倉曎する必芁があるため、71バむトのファむルを取埗したす。 さらに、凊理プログラムはMAXVAL 1を奜たない堎合があり、MAXVAL 255さらに2バむトに倉曎する必芁がありたす。

䞀般に、透明床のない単䞀ピクセル画像の堎合、最小はPNMPNMの堎合8から14バむト察FLIFの14から18であり、透明床の堎合、最小はFLIFFLIFの堎合14から20バむト察67から69です。 PAMのバむト。

さたざたな単䞀ピクセル画像に最適なファむルサむズの比范プレヌトを次に瀺したす。



非圧瞮圢匏が圧瞮圢匏よりも優れおいるのは奇劙に思えるかもしれたせん。 しかし、考えおみるず、シングルピクセル画像は画像圧瞮の最悪の遞択肢です。 ファむル党䜓はヘッダヌず远加情報で構成され、その䞭にはデヌタがほずんどありたせん。 たた、圧瞮は予枬可胜性に基づいおいるため、圧瞮できるデヌタはほずんどありたせん。たた、単䞀ピクセルをどのように予枬できたすか

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


All Articles