XZ(1) | XZ Utils | XZ(1) |
xz, unxz, xzcat, lzma, unlzma, lzcat — стискання та розпаковування файлів .xz і .lzma
xz [параметр...] [файл...]
unxz є
рівноцінним
до xz --decompress.
xzcat є
рівноцінним
до xz --decompress --stdout.
lzma є
рівноцінним
до xz --format=lzma.
unlzma є
рівноцінним
до xz --format=lzma --decompress.
lzcat є
рівноцінним
до xz --format=lzma --decompress --stdout.
При написанні скриптів, де потрібно розпаковувати файли, рекомендуємо завжди використовувати xz із відповідними аргументами (xz -d або xz -dc), замість unxz і xzcat.
xz інструмент загального призначення для стискання даних із синтаксисом командного рядка, подібним для gzip(1) і bzip2(1). Власним форматом файлів є .xz, але передбачено підтримку застарілого формату .lzma, який було використано у LZMA Utils, та необроблених потоків стиснених даних без заголовків формату контейнера. Крім того, передбачено підтримку розпаковування формату .lz, який використано у lzip.
xz стискає або розпаковує кожен файл відповідно до вибраного режиму дій. Якщо файли не задано або якщо файлом є -, xz читатиме дані зі стандартного джерела вхідних даних і записуватиме оброблені дані до стандартного виведення. xz відмовить (покаже повідомлення про помилку і пропустить файл) у записів стиснених даних до стандартного виведення, якщо це термінал. Так само, xz відмовить у читанні стиснених даних зі стандартного джерела вхідних даних, якщо це термінал.
Якщо не вказано --stdout, файли, відмінні від -, буде записано до нового файла, чию назву буде визначено з назви початкового файла:
Якщо файл призначення вже існує, буде показано повідомлення про помилку, а файл буде пропущено.
Окрім випадку запису до стандартного виведення, xz покаже попередження і пропустить обробку файла, якщо буде виконано будь-яку з таких умов:
Після успішного стискання або розпаковування файла, xz копіює дані щодо власника, групи, прав доступу, часу доступу та моменту внесення змін з початкового файла до файла призначення. Якщо копіювання даних щодо групи зазнає невдачі, права доступу буде змінено так, що файл призначення стане недоступним для користувачів, які не мають права доступу до початкового файла. В xz ще не передбачено підтримки копіювання інших метаданих, зокрема списків керування доступом або розширених атрибутів.
Щойно файл призначення буде успішно закрито, початковий файл буде вилучено, якщо не вказано параметра --keep. Початковий файл ніколи не буде вилучено, якщо виведені дані буде записано до стандартного виведення або якщо станеться помилка.
Надсилання SIGINFO або SIGUSR1 до процесу xz призводить до виведення даних щодо поступу до стандартного виведення помилок. Це має лише обмежене використання, оскільки якщо стандартним виведенням помилок є термінал, використання --verbose призведе до показу автоматично оновлюваного індикатора поступу.
Використання xz пам'яті може бути різним: від декількох сотень кілобайтів до декількох гігабайтів, залежно від параметрів стискання. Параметри, які використано при стисканні файла, визначають вимоги до об'єму пам'яті при розпакуванні. Типово, засобу розпаковування потрібно від 5 % до 20 % об'єму пам'яті, якого засіб стискання потребує при створенні файла. Наприклад, розпаковування файла, який створено з використанням xz -9, у поточній версії потребує 65 МіБ пам'яті. Втім, можливе створення файлів .xz, які потребуватимуть для розпаковування декількох гігабайтів пам'яті.
Ймовірність високого рівня використання пам'яті може бути особливо дошкульною для користувачів застарілих комп'ютерів. Щоб запобігти прикрим несподіванкам, у xz передбачено вбудований обмежувач пам'яті, який типово вимкнено. Хоча у деяких операційних системах передбачено спосіб обмежити використання пам'яті процесами, сподівання на його ефективність не є аж надто гнучким (наприклад, використання ulimit(1) для обмеження віртуальної пам'яті призводить до викривлення даних mmap(2)).
Обмежувач пам'яті можна увімкнути за допомогою параметра командного рядка --memlimit=обмеження. Часто, зручніше увімкнути обмежувач на типовому рівні, встановивши значення для змінної середовища XZ_DEFAULTS, наприклад, XZ_DEFAULTS=--memlimit=150MiB. Можна встановити обмеження окремо для стискання і розпакування за допомогою --memlimit-compress=limit and --memlimit-decompress=обмеження. Використання цих двох параметрів поза XZ_DEFAULTS не таке вже і корисне, оскільки одноразовий запуск xz не може одночасно призводити до стискання та розпаковування, а набрати у командному рядку --memlimit=обмеження (або -M обмеження) набагато швидше.
Якщо під час розпаковування вказане обмеження буде перевищено, xz покаже повідомлення про помилку, а розпаковування файла зазнає невдачі. Якщо обмеження буде перевищено при стисканні, xz спробує масштабувати параметри так, щоб не перевищувати обмеження (окрім випадків використання --format=raw або --no-adjust). Отже, дію буде виконано, якщо обмеження не є надто жорстким. Масштабування параметрів буде виконано кроками, які не збігаються із рівнями шаблонів стискання. Наприклад, якщо обмеження лише трохи не вкладається у об'єм потрібний для xz -9, параметри буде змінено лише трохи, не до рівня xz -8.
Можна поєднати файли .xz без додаткової обробки. xz розпакує такі файли так, наче вони є єдиним файлом .xz.
Можна додати доповнення між з'єднаними частинами або після останньої частини. Доповнення має складатися із нульових байтів і мати розмір, який є кратним до чотирьох байтів. Це може бути корисним, наприклад, якщо файл .xz зберігається на носії даних, де розміри файла вимірюються у 512-байтових блоках.
Поєднання та заповнення не можна використовувати для файлів .lzma або потоків необроблених даних.
У більшості місць, де потрібен цілочисельний аргумент, передбачено підтримку необов'язкового суфікса для простого визначення великих цілих чисел. Між цілим числом і суфіксом не повинно бути пробілів.
Можна скористатися особливим значенням max для позначення максимального цілого значення, підтримку якого передбачено для параметра.
Якщо вказано декілька параметрів режиму дій, буде використано лише останній з них.
Шаблон | DictSize | CompCPU | CompMem | DecMem |
-0 | 256 КіБ | 0 | 3 МіБ | 1 МіБ |
-1 | 1 МіБ | 1 | 9 МіБ | 2 МіБ |
-2 | 2 МіБ | 2 | 17 МіБ | 3 МіБ |
-3 | 4 МіБ | 3 | 32 МіБ | 5 МіБ |
-4 | 4 МіБ | 4 | 48 МіБ | 5 МіБ |
-5 | 8 МіБ | 5 | 94 МіБ | 9 МіБ |
-6 | 8 МіБ | 6 | 94 МіБ | 9 МіБ |
-7 | 16 МіБ | 6 | 186 МіБ | 17 МіБ |
-8 | 32 МіБ | 6 | 370 МіБ | 33 МіБ |
-9 | 64 МіБ | 6 | 674 МіБ | 65 МіБ |
Шаблон | DictSize | CompCPU | CompMem | DecMem |
-0e | 256 КіБ | 8 | 4 МіБ | 1 МіБ |
-1e | 1 МіБ | 8 | 13 МіБ | 2 МіБ |
-2e | 2 МіБ | 8 | 25 МіБ | 3 МіБ |
-3e | 4 МіБ | 7 | 48 МіБ | 5 МіБ |
-4e | 4 МіБ | 8 | 48 МіБ | 5 МіБ |
-5e | 8 МіБ | 7 | 94 МіБ | 9 МіБ |
-6e | 8 МіБ | 8 | 94 МіБ | 9 МіБ |
-7e | 16 МіБ | 8 | 186 МіБ | 17 МіБ |
-8e | 32 МіБ | 8 | 370 МіБ | 33 МіБ |
-9e | 64 МіБ | 8 | 674 МіБ | 65 МіБ |
Нетиповий ланцюжок фільтрування уможливлює докладне визначення параметрів стискання замість використання параметрів, які пов'язано із наперед визначеними рівнями стискання. Якщо вказано нетиповий ланцюжок фільтрів, параметри рівнів стискання (-0 ... -9 і --extreme), які передують їм у рядку команди, буде знехтувано. Якщо параметр рівня стискання вказано після одного або декількох параметрів нетипового ланцюжка фільтрів, буде використано рівень стискання, а попередніми параметрами ланцюжка фільтрування буде знехтувано.
Ланцюжок фільтрів можна порівняти із конвеєром у командному рядку. При стисканні нестиснені вхідні дані потрапляють до першого фільтра, виведені ним дані йдуть до наступного фільтра (якщо такий є). Виведені останнім фільтром дані буде записано до стисненого файла. Максимальна кількість фільтрів у ланцюжку дорівнює чотирьом, але у типовому ланцюжку фільтрів використовують один або два фільтри.
У багатьох фільтрів є обмеження на місце перебування у ланцюжку фільтрів: деякі фільтри можуть працювати, лише якщо вони є останніми у ланцюжку, деякі, лише якщо не останніми, а деякі працюють у будь-якій позиції ланцюжка. Залежно від фільтра, це обмеження є наслідком структури фільтра або існує для запобігання проблем із захистом.
Нетиповий ланцюжок фільтрів визначають за допомогою одного або декількох параметрів фільтрування у бажаному для ланцюжка фільтрування порядку. Тобто порядок параметрів фільтрування впливає на результат! При декодуванні необробленого потоку даних (--format=raw) ланцюжок фільтрів визначають у тому самому порядку, який використовують для стискання даних.
Фільтри приймають специфічні для фільтрів параметри у форматі списку значень, які відокремлено комами. Зайві коми у параметрах буде проігноровано. У кожного параметра є типове значення, отже, вам слід вказати лише ті параметри, значення яких ви хочете змінити.
Щоб переглянути увесь ланцюжок фільтрів та параметри, скористайтеся командою xz -vv (тобто, скористайтеся --verbose двічі). Це працює також для перегляду параметрів ланцюжка фільтрів, який використано у рівнях стискання.
Фільтр | Вирівнювання | Нотатки |
x86 | 1 | 32-бітова або 64-бітова x86 |
ARM | 4 | |
ARM-Thumb | 2 | |
ARM64 | 4 | Найкращим є вирівнювання за |
4096 байтами | ||
PowerPC | 4 | Лише зворотний порядок байтів |
IA-64 | 16 | Itanium |
SPARC | 4 |
Режим робота активують за допомогою параметра --robot. Він спрощує обробку виведених xz даних іншими програмами. У поточній версії підтримку --robot передбачено лише разом із --version, --info-memory та --list. У майбутньому підтримку параметра буде передбачено для стискання та розпаковування.
xz --robot --version виведе назву версії xz і liblzma у такому форматі:
XZ_VERSION=XYYYZZZS
LIBLZMA_VERSION=XYYYZZZS
XYYYZZZS є тим самим в обох рядках, якщо xz і liblzma належать до одного випуску XZ Utils.
Приклади: 4.999.9beta — це 49990091, а 5.0.0 — це 50000002.
xz --robot --info-memory виводить один рядок з трьома відокремленими табуляціями стовпчиками:
У майбутньому у виведенні xz --robot --info-memory може бути більше стовпчиків, але у виведеному буде не більше за один рядок.
У xz --robot --list використано табуляції для поділу виведених даних. Першим стовпчиком у кожному рядку є рядок, що вказує на тип відомостей, які можна знайти у цьому рядку:
Стовпчики у рядках файла:
Стовпчики у рядках stream:
Стовпчики у рядках block:
Якщо --verbose було вказано двічі, до рядків block буде включено додаткові стовпчики. Ці стовпчики не буде показано, якщо вказано одинарний параметр --verbose, оскільки отримання цих відомостей потребує багатьох позиціювань, а ця процедура може бути повільною:
Стовпчики у рядках summary:
Починаючи з xz 5.1.2alpha:
Стовпчики рядка totals:
Якщо --verbose було вказано двічі, до рядка totals буде включено додаткові стовпчики:
Починаючи з xz 5.1.2alpha:
У майбутніх версіях може бути додано нові типи рядків і нові стовпчики до наявних типів рядків, але наявні стовпчики мають лишитися незмінними.
Зауваження (не попередження або помилки), які виведено до стандартного виведення помилок, не впливають на стан виходу.
xz обробляє списки відокремлених пробілами параметрів зі змінних середовища XZ_DEFAULTS і XZ_OPT, перш ніж обробляти параметри з рядка команди. Зауважте, що буде оброблено лише параметри зі змінних середовища; усі непараметричні записи буде без повідомлень проігноровано. Обробку буде виконано за допомогою функції getopt_long(3), яку також використовують для аргументів рядка команди.
XZ_OPT=-2v tar caf foo.tar.xz foo
XZ_OPT=${XZ_OPT-"-7e"} export XZ_OPT
Синтаксис рядка команди xz практично є надбудовою щодо lzma, unlzma і lzcat з LZMA Utils 4.32.x. У більшості випадків можна замінити LZMA Utils XZ Utils без порушення працездатності наявних скриптів. Втім, існують певні несумісності, які іноді можуть спричиняти проблеми.
Нумерація у шаблонах рівнів стискання у xz не є тотожною до нумерації у LZMA Utils. Найважливішою відмінністю є прив'язка розмірів словника до різних шаблонів. Розмір словника грубо рівний використанню пам'яті у засобі розпаковування.
Рівень | xz | LZMA Utils |
-0 | 256 КіБ | н/д |
-1 | 1 МіБ | 64 КіБ |
-2 | 2 МіБ | 1 МіБ |
-3 | 4 МіБ | 512 КіБ |
-4 | 4 МіБ | 1 МіБ |
-5 | 8 МіБ | 2 МіБ |
-6 | 8 МіБ | 4 МіБ |
-7 | 16 МіБ | 8 МіБ |
-8 | 32 МіБ | 16 МіБ |
-9 | 64 МіБ | 32 МіБ |
Відмінності у розмірах словників також впливають на використання пам'яті засобом стискання, але є і інші відмінності між LZMA Utils і XZ Utils, які роблять різницю ще помітнішою:
Рівень | xz | LZMA Utils 4.32.x |
-0 | 3 МіБ | н/д |
-1 | 9 МіБ | 2 МіБ |
-2 | 17 МіБ | 12 МіБ |
-3 | 32 МіБ | 12 МіБ |
-4 | 48 МіБ | 16 МіБ |
-5 | 94 МіБ | 26 МіБ |
-6 | 94 МіБ | 45 МіБ |
-7 | 186 МіБ | 83 МіБ |
-8 | 370 МіБ | 159 МіБ |
-9 | 674 МіБ | 311 МіБ |
Типовим рівнем стискання у LZMA Utils є -7, а у XZ Utils — -6, отже, обидва комплекти програм типово використовують словник розміром у 8 МіБ.
Розмір нестисненого файла може бути збережено у заголовку .lzma. LZMA Utils зберігають дані при стисканні звичайних файлів. Альтернативним підходом є позначення нестисненого розміру як невідомого і використання позначки кінця вмісту для позначення місця, де засіб розпаковування має зупинитися. У LZMA Utils цей спосіб використовують, якщо нестиснений розмір є невідомим, що трапляється, наприклад, для конвеєрів обробки даних.
У xz передбачено підтримку розпаковування файлів .lzma з позначкою кінця вмісту та без неї, але усі файли .lzma, які створено за допомогою xz, використовують позначку кінця вмісту, а нестиснений розмір у заголовку .lzma позначають як невідомий. Це може призвести до проблем у деяких нетипових ситуаціях. Наприклад, розпакувальник .lzma у вбудованому пристрої може працювати лише з файлами, для яких відомий нестиснений розмір. Якщо ви зіткнулися з цією проблемою, вам слід скористатися LZMA Utils або LZMA SDK для створення файлів .lzma із відомим розміром нестиснених даних.
У форматі .lzma можливі значення lc аж до 8 і значення lp аж до 4. LZMA Utils можуть розпаковувати файли із будь-якими значеннями lc і lp, але завжди створюють файли з lc=3 і lp=0. Створення файлів з іншими значеннями lc і lp є можливим за допомогою xz і LZMA SDK.
Реалізація фільтра LZMA1 у liblzma потребує, щоби сума lc і lp не перевищувала 4. Отже, файли .lzma, у яких перевищено обмеження, не може бути розпаковано за допомогою xz.
LZMA Utils створюють лише файли .lzma, які мають розмір словника у 2^n (степінь 2), але приймають файли із будь-яким розміром словника. liblzma приймає лише файли .lzma, які мають розмір словника 2^n або 2^n + 2^(n-1). Так зроблено для зменшення помилок при виявленні файлів .lzma.
Ці обмеження не мають призводити до проблем на практиці, оскільки практично усі файли .lzma було стиснено з використанням параметрів, які приймає liblzma.
При розпаковуванні LZMA Utils без повідомлень ігнорують усі дані після першого потоку .lzma. У більшості випадків це пов'язано із вадою у програмі. Це також означає, що у LZMA Utils не передбачено підтримки розпаковування з'єднаних файлів .lzma.
Якщо після першого потоку .lzma лишилися дані, xz вважатиме файл пошкодженим, якщо не було використано --single-stream. Це може зашкодити роботі скриптів, де зроблено припущення, що кінцеві зайві дані буде проігноровано.
Точні стиснені дані, які створено на основі того самого нестисненого файла вхідних даних, можуть бути різними для різних версій XZ Utils, навіть якщо використано однакові параметри стискання. Причиною цього є удосконалення у кодувальнику (пришвидшення або краще стискання) без зміни формату файлів. Виведені дані можуть бути різними навіть для різних збірок тієї самої версії XZ Utils, якщо використано різні параметри збирання.
Написане вище означає, що після реалізації --rsyncable файли-результати не обов'язково можна буде синхронізувати за допомогою rsyncable, якщо старий і новий файли було стиснено за допомогою тієї самої версії xz. Цю проблему можна усунути, якщо буде заморожено частину реалізації кодувальника, щоб введені для rsync дані були стабільними між версіями xz.
У вбудованих реалізаціях розпакувальника .xz, подібних до XZ Embedded, не обов'язково передбачено підтримку файлів, які створено із типами перевірки цілісності, відмінними від none і crc32. Оскільки типовим є --check=crc64, вам слід використовувати --check=none або --check=crc32 при створенні файлів для вбудованих систем.
Поза вбудованими системами, в усіх засобах розпаковування формату .xz передбачено підтримку усіх типів перевірок або принаймні можливість розпакувати файл без перевірки цілісності, якщо підтримки певної перевірки не передбачено.
У XZ Embedded передбачено підтримку BCJ, але лише з типовим початковим зсувом.
Стиснути файл foo до foo.xz за допомогою типового рівня стискання (-6) і вилучити foo, якщо стискання відбулося успішно:
xz foo
Розпакувати bar.xz до bar і не вилучати bar.xz, навіть якщо розпаковування відбулося успішно:
xz -dk bar.xz
Створити baz.tar.xz з використанням шаблона -4e (-4 --extreme), який є повільнішими за типовий -6, але потребує менше пам'яті для стискання та розпаковування (48 МіБ та 5 МіБ, відповідно):
tar cf - baz | xz -4e > baz.tar.xz
Суміш стиснених і нестиснених файлів можна розпакувати до стандартного виведення за допомогою єдиної команди:
xz -dcf a.txt b.txt.xz c.txt d.txt.lzma > abcd.txt
У GNU і *BSD можна скористатися find(1) і xargs(1) для паралельного стискання багатьох файлів:
find . -type f \! -name '*.xz' -print0 \ | xargs -0r -P4 -n16 xz -T1
Параметр -P xargs(1) встановлює кількість паралельних процесів xz. Найкраще значення параметра -n залежить від того, скільки файлів має бути стиснено. Якщо файлів мало, значенням, ймовірно, має бути 1. Якщо файлів десятки тисяч, може знадобитися значення 100 або навіть більше, щоб зменшити кількість процесів xz, які врешті створить xargs(1).
Параметр -T1 для xz тут для примусового встановлення однопотокового режиму, оскільки для керування рівнем паралелізації використано xargs(1).
Обчислити скільки байтів було заощаджено загалом після стискання декількох файлів:
xz --robot --list *.xz | awk '/^totals/{print $5-$4}'
Скрипту можуть знадобитися дані щодо того, що використано достатньо нову версію xz. У наведеному нижче скрипті sh(1) виконано перевірку того, що номер версії засобу xz є принаймні рівним 5.0.0. Цей спосіб є сумісним зі старими тестовими версіями, де не передбачено підтримки параметра --robot:
if ! eval "$(xz --robot --version 2> /dev/null)" || [ "$XZ_VERSION" -lt 50000002 ]; then echo "Your xz is too old." fi unset XZ_VERSION LIBLZMA_VERSION
Встановити обмеження на використання пам'яті для розпаковування за допомогою XZ_OPT, але якщо обмеження вже було встановлено, не збільшувати його:
NEWLIM=$((123 << 20)) # 123 MiB OLDLIM=$(xz --robot --info-memory | cut -f3) if [ $OLDLIM -eq 0 -o $OLDLIM -gt $NEWLIM ]; then XZ_OPT="$XZ_OPT --memlimit-decompress=$NEWLIM" export XZ_OPT fi
Найпростішим використанням ланцюжка фільтрів є налаштовування шаблона LZMA2. Це може бути корисним, оскільки у шаблонах використано лише підмножину потенційно корисних комбінацій параметрів стискання.
При налаштовуванні шаблонів LZMA2 корисними є стовпчики CompCPU таблиць з описів параметрів -0 ... -9 і --extreme. Ось відповідні частини з цих двох таблиць:
Шаблон | CompCPU |
-0 | 0 |
-1 | 1 |
-2 | 2 |
-3 | 3 |
-4 | 4 |
-5 | 5 |
-6 | 6 |
-5e | 7 |
-6e | 8 |
Якщо вам відомо, що певний файл потребує дещо більшого словника (наприклад, 32 МіБ) для якісного стискання, але ви хочете стиснути його швидше за команду xz -8, можна внести зміни до шаблона із нижчим значенням CompCPU (наприклад, 1) для використання більшого словника:
xz --lzma2=preset=1,dict=32MiB foo.tar
Для певних файлів наведена вище команда може працювати швидше за xz -6 і стискати дані значно краще. Втім, слід наголосити, переваги більшого словника з одночасним низьким значенням CompCPU проявляються лише для деяких файлів. Найочевиднішим випадком, коли великий словник є корисним, є випадок, коли архів містить дуже подібні файли розміром у принаймні декілька мегабайтів. Розмір словника має бути значно більшим за будь-який окремий файл, щоб у LZMA2 було використано усі переваги подібностей між послідовними файлами.
Якщо дуже високий рівень використання пам'яті у засобі стискання або розпаковування не є проблемою, і файли, який стискають має об'єм у принаймні декілька десятків мегабайтів, може бути корисним використання навіть більшого за 64 МіБ словника, який використано у xz -9:
xz -vv --lzma2=dict=192MiB big_foo.tar
Використання -vv (--verbose --verbose), подібно до наведеного вище прикладу, може бути корисним для перегляду вимог з боку засобів стискання та розпаковування до пам'яті. Пам'ятайте, що використання словника, розмір якого перевищує розмір файла, який стискають, є простоюю витратою пам'яті, отже наведену вище команду не варто використовувати для малих файлів.
Іноді час стискання не має значення, але використання пам'яті засобом розпаковування має бути низьким для того, щоб, наприклад, уможливити розпаковування файла у вбудованій системі. У наведеній нижче команді використано -6e (-6 --extreme) як основу і встановлено розмір словника лише у 64 КіБ. Файл-результат можна розпакувати за допомогою XZ Embedded (ось чому використано --check=crc32) з використанням лише 100 КіБ пам'яті.
xz --check=crc32 --lzma2=preset=6e,dict=64KiB foo
Якщо вам потрібно витиснути зі стискання максимальну кількість байтів, може допомогти коригування кількості бітів контексту літералів (lc) та кількість позиційних бітів (pb). Також може допомогти коригування кількості бітів позиції літералів (lp), але, зазвичай, важливішими є lc і pb. Наприклад, в архівах зі початковим кодом міститься здебільшого текст US-ASCII, щось подібне до наведеного нижче може дещо (на щось близьке до 0,1 %) зменшити файл, порівняно із xz -6e (спробуйте також без lc=4):
xz --lzma2=preset=6e,pb=0,lc=4 source_code.tar
Використання іншого фільтра разом із LZMA2 може покращити стискання для певних типів файлів. Наприклад, для стискання бібліотеки спільного користування x86-32 або x86-64 з використанням фільтра BCJ x86 скористайтеся такою командою:
xz --x86 --lzma2 libfoo.so
Зауважте, що порядок параметрів фільтрування має значення. Якщо --x86 вказано після --lzma2, xz повідомить про помилку, оскільки після LZMA2 не може бути жодного фільтра, а також оскільки фільтр BCJ x86 не можна використовувати як останній фільтр у ланцюжку.
Фільтр Delta разом із LZMA2 може дати добрі результати для растрових зображень. Зазвичай, результати є кращими за формат PNG, у якого є декілька більш досконалих фільтрів, ніж проста дельта, але там використовують для стискання Deflate.
Зображення слід берегти у нестисненому форматі, наприклад, як нестиснений TIFF. Параметр відстані фільтра Delta встановлюють так, щоб він збігався із кількістю байтів на піксель у зображенні. Наприклад, для 24-бітового растрового зображення RGB слід вказати dist=3, а також добре передати pb=0 до LZMA2 для пристосовування до трибайтового вирівнювання:
xz --delta=dist=3 --lzma2=pb=0 foo.tiff
Якщо в один архів запаковано декілька зображень (наприклад, в архів .tar), фільтр Delta також даватиме добрі результати, якщо у всіх зображеннях однакова кількість байтів для кожного пікселя.
xzdec(1), xzdiff(1), xzgrep(1), xzless(1), xzmore(1), gzip(1), bzip2(1), 7z(1)
XZ Utils: <https://tukaani.org/xz/>
Вбудовуваний
XZ: <https://tukaani.org/xz/embedded.html>
LZMA SDK: <http://7-zip.org/sdk.html>
1 грудня 2022 року | Tukaani |