пʼятниця, 21 грудня 2007 р.

Оптимізація фотографій для вебу: розміри, колір і стиснення

На нашому форумі http://forum.nerusoft.com у 2007 році обговорювали практичну задачу: панорама готова, але файл вийшов завеликим. Як зменшити його обсяг, які параметри стиснення вибрати й чи варто скорочувати кількість кольорів?

До двох кольорів теж можна дійти — питання лише в тому, що залишиться від панорами :) Тому для мене оптимізація завжди мала дві цілі: зменшити файл і не перестаратися так, щоб зображення стало непридатним.

У своїй роботі я використовував Corel PHOTO-PAINT 11. Основних способів було три: змінити розміри в пікселях, колірне представлення або формат і параметри експорту.

1. Розміри в пікселях: скільки деталей справді потрібно

Спочатку визначте, як людина переглядатиме панораму. Для загального уявлення про місцевість і для роздивляння дрібних деталей потрібні різні розміри зображення. Особливо це відчувалося на повільному інтернет-з’єднанні.

У PHOTO-PAINT 11 я діяв так:

  1. Відкривав фотографію й переходив до Image → Resample.
  2. Задавав відсоток лінійних розмірів, який потрібно залишити. Серед моїх проб були 75–50% зі збереженням пропорцій.
  3. Підтверджував зміну й дивився, чи залишилися потрібні деталі.
  4. Якщо зменшив забагато — повертався через Ctrl+Z і пробував інше значення.

Менше пікселів означає менше сирих даних. Але точний обсяг готового файла залежить також від самого зображення та способу кодування. Оригінал варто тримати окремо, щоб мати з чим порівнювати кожну спробу.

2. Колірна глибина й палітра

Число 256 у розмові про 8-бітну палітру означає кількість можливих індексів кольорів. Повноколірна фотографія під час такого перетворення може втратити плавність градієнтів; застосування дизерингу іноді додає помітну зернистість.

Для зображення 480 × 480 маємо 230 400 пікселів. Обсяг масиву пікселів без стиснення можна порівняти так:

Представлення Байтів на піксель Даних для 480 × 480
8-бітні індекси палітри 1 230 400 байтів
24-бітне RGB 3 691 200 байтів
48-бітне RGB 6 1 382 400 байтів

У цьому спрощеному розрахунку немає заголовків, палітри, вирівнювання й інших службових даних. Перехід із 48 до 24 біт удвічі скорочує саме колірний масив, а до 8-бітних індексів — у шість разів. Розмір стисненого файла змінюватиметься за іншими співвідношеннями.

У PHOTO-PAINT я відкривав Image → Color Mode, пробував 8-бітний режим і варіанти палітри Optimized та Adaptive. Після перетворення уважно дивився на небо, горизонт і плавні переходи. Якщо результат не влаштовував, повертав зміну й добирав інші параметри.

3. Формат і спосіб стиснення

  • BMP. Нестиснений растровий варіант може займати багато місця. Водночас у сімействі BMP є й способи стиснення, зокрема RLE для індексованих зображень.
  • TIFF. Контейнер для різних способів кодування. Він може зберігати дані без стиснення або з різними схемами стиснення; втрати й обсяг залежать від конкретного варіанта.
  • GIF. Для окремої таблиці використовує палітру до 256 кольорів і стиснення LZW. Саме стиснення зберігає індекси пікселів; втрата кольорів може статися раніше, під час перетворення фотографії на палітру. GIF також підтримує анімацію.
  • PNG. Дає стиснення без втрат, підтримує палітру, відтінки сірого, truecolor і прозорість. Для анімації є APNG: його включено до третьої редакції специфікації W3C від 24 червня 2025 року.
  • JPEG. Поширений для фотографій DCT-варіант використовує стиснення з втратами. Налаштування експорту дозволяють шукати компроміс між обсягом, деталізацією та артефактами.

GIF і патентна історія LZW

Історичні суперечки навколо GIF стосувалися патентів на алгоритм LZW. W3C вказує, що патент Unisys у США закінчився 20 червня 2003 року, і повідомляє про завершення його дії в низці інших країн. GNU також описує завершення відповідних патентних обмежень. Ця історія не була загальною забороною розміщувати будь-який GIF на вебсторінці.

Мій результат із панорамою в PHOTO-PAINT 11

Для JPEG я використовував File → Save As, а також пробував Export For Web та Image Optimized. У параметрах експорту зазвичай позначав Progressive й Optimized.

Із записаних мною варіантів Sub Format: Standard та Optional для конкретного скрипту панорам спрацював Standard. З іншим варіантом той скрипт працювати не захотів.

Для однієї панорами пробував Compression і Smoothing по 43%. Наскільки пам’ятав, розміри й кількість кольорів при цьому не змінював. Файл зменшився приблизно з 6 МБ до 400 КБ. На горизонті вже було помітно втрату якості, але загалом результат мене влаштував.

Адреса того прикладу: http://3r.kiev.ua/downloads/panorams/bot_sad/.

Значення близько 10–30% у моїх пробах давали менш помітні зміни. Це була шкала параметрів PHOTO-PAINT 11; у конкретному експортері орієнтуйтеся на результат, а не лише на число. Порівнюйте кілька варіантів із незміненим оригіналом і вибирайте найменший файл, який ще зберігає потрібні деталі.

Технічні джерела: специфікація PNG, специфікація GIF89a, W3C про GIF, PNG та LZW, GNU про патентну історію GIF, JPEG 1, опис TIFF у Бібліотеці Конгресу, Microsoft про стиснення бітових зображень.

Немає коментарів:

K2 Chat — навіщо бізнесу ще один месенджер, особливо під час війни?

«Де файл?» — «У чаті». — «У якому із семи?» Знайома ситуація? Коли робочі домовленості розпорошені між месенджерами, команді складніше знах...