PackBits - PackBits - Wikipedia
![]() | tento článek ne uvést žádný Zdroje.Říjen 2011) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
PackBits je rychlý a jednoduchý bezztrátová komprese schéma pro kódování délky běhu dat.
Jablko představil formát PackBits s vydáním MacPaint na Macintosh počítač. Toto schéma komprese je jedním z typů komprese, které lze použít TIFF -soubory. TGA -files také používají toto schéma komprese RLE, ale s datovým tokem zachází jako s pixely místo s bajty.
Datový proud PackBits se skládá z paketů s jednobajtovou hlavičkou následovanou daty. Záhlaví je podepsaný bajt; data mohou být podepsána, nepodepsána nebo zabalena (například pixely MacPaint).
V následující tabulce n je hodnota bajtu záhlaví jako celé číslo se znaménkem.
Bajt záhlaví | Data za bajtem záhlaví |
---|---|
0 až 127 | (1 + n) doslovný bajtů dat |
−1 až −127 | Jeden bajt dat, opakovaný (1 - n) krát v dekomprimovaném výstupu |
−128 | Žádná operace (přeskočit a považovat další bajt za bajt záhlaví) |
Interpretace 0 jako kladné nebo záporné nemá žádný rozdíl ve výstupu. Spuštění dvou bajtů sousedících s neběhy se obvykle zapisují jako doslovná data. Na základě dat PackBits nelze určit konec datového proudu; to znamená, že před čtením datového proudu PackBits již musíte znát velikost komprimovaných nebo nekomprimovaných dat, abyste věděli, kde končí.
Apple Computer (viz externí odkaz) poskytuje tento krátký příklad zabalených dat:FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA
Následující kód napsaný v Microsoft VBA rozbalí data:
Sub UnpackBitsDemo() Ztlumit Soubor Tak jako Varianta Ztlumit MyOutput Tak jako Tětiva Ztlumit Počet Tak jako Dlouho Ztlumit i Tak jako Dlouho, j Tak jako Dlouho Soubor = „FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA“ Soubor = Rozdělit(Soubor, " ") Pro i = LBound(Soubor) Na UBound(Soubor) Počet = aplikace.Funkce listu.Hex2Dec(Soubor(i)) Vybrat Případ Počet Případ Je >= 128 Počet = 256 - Počet „Doplněk dvou Pro j = 0 Na Počet „nulové MyOutput = MyOutput & Soubor(i + 1) & " " další j i = i + 1 „Upravte ukazatel Případ Jiný Pro j = 0 Na Počet „nulové MyOutput = MyOutput & Soubor(i + j + 1) & " " další j i = i + j „Upravte ukazatel Konec Vybrat další i Ladit.Tisk MyOutput 'AA AA AA 80 00 2A AA AA AA AA 80 00 2A 22 AA AA AA AA AA AA AA AA AA AA AA AAKonec Sub
Stejná implementace v JS:
/** * Pomocné funkce k vytvoření čitelného vstupu a výstupu * * Podívejte se také na toto housle pro interaktivní dekodér PackBits: * https://jsfiddle.net/volter9/tj04ejdt/ */funkce str2hex (str) { vrátit se str.rozdělit('').mapa(funkce (char) { var hodnota = char.charCodeAt(0); vrátit se ((hodnota < 16 ? '0' : '') + hodnota.toString(16)).toUpperCase(); }).připojit se(' ');}funkce hex2str (hex) { vrátit se hex.rozdělit(' ').mapa(funkce (tětiva) { vrátit se Tětiva.fromCharCode(analyzovat(tětiva, 16)); }).připojit se('');}/** * Funkce PackBits rozbalení * * @param {String} data * @return {řetězec:} */funkce rozbalit bity (data) { var výstup = '', i = 0; zatímco (i < data.délka) { var hex = data.charCodeAt(i); -li (hex >= 128) { hex = 256 - hex; pro (var j = 0; j <= hex; ++j) { výstup += data.charAt(i + 1); } ++i; } jiný { pro (var j = 0; j <= hex; ++j) { výstup += data.charAt(i + j + 1); } i += j; } ++i; } vrátit se výstup;}var originál = „FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA“, data = rozbalit bity(hex2str(originál));// Výstup je: AA AA AA 80 00 2A AA AA AA AA 80 00 2A 22 AA AA AA AA AA AA AA AA AA AA AA AAřídicí panel.log(str2hex(data));
externí odkazy
- Webová stránka Apple popisující formát PackBits
- Algoritmus TIFF PackBits převzato z https://www.fileformat.info stránky se svolením Corion.net
- KOMPAKTNÍ komprese nebo proč podporujeme bezztrátovou kompresní metodu TIFF? článek na webu https://www.universal-document-converter.com také popisuje algoritmus.