Що таке файл JPEG?
JPEG — це тип формату зображення, який зберігається за допомогою методу стиснення з втратами. Вихідне зображення, як результат стиснення, є компромісом між розміром пам’яті та якістю зображення. Користувачі можуть регулювати рівень стиснення, щоб досягти бажаного рівня якості, одночасно зменшуючи розмір пам’яті. Якщо до зображення застосувати стиснення 10:1, на якість зображення вплине незначно. Чим вище значення стиснення, тим більше погіршується якість зображення.
Специфікації формату файлу
Формат файлів зображень JPEG був стандартизований Joint Photographic Experts Group і, отже, отримав назву JPEG. Формат був обраний для зберігання та передачі фотографічних зображень в Інтернеті. Майже всі операційні системи тепер мають засоби перегляду, які підтримують візуалізацію зображень JPEG, які також часто зберігаються з розширенням JPG. Навіть веб-браузери підтримують візуалізацію зображень JPEG. Перш ніж переходити до специфікацій формату файлу JPEG, необхідно згадати загальний процес створення JPEG.
Етапи стиснення JPEG
Трансформація: Кольорові зображення перетворюються з RGB на зображення яскравості/кольорності (око чутливе до яскравості, а не до кольоровості, тому частина кольоровості може втратити багато даних і, таким чином, може бути сильно стиснута).
Зменшення вибірки: Зменшення вибірки виконується для кольорового компонента, а не для компонента яскравості. Зменшення вибірки виконується у співвідношенні 2:1 по горизонталі та 1:1 по вертикалі (2 год. 1 В). Таким чином зображення зменшується в розмірі, оскільки компонент «y» не торкається, немає помітної втрати якості зображення.
Організація в групи: Пікселі кожного компонента кольору організовані в групи 8×2 пікселів, які називаються «одиницями даних», якщо кількість рядків або стовпців не кратна 8, нижній рядок і крайні праві стовпці дублюються.
Дискретне косинусне перетворення: Дискретне косинусне перетворення (DCT) застосовується до кожного блоку даних для створення карти 8×8 трансформованих компонентів. DCT передбачає певну втрату інформації через обмежену точність комп’ютерної арифметики. Це означає, що навіть без карти буде деяка втрата якості зображення, але зазвичай вона невелика.
Квантування: кожен із 64 перетворених компонентів в блоці даних ділиться на окреме число, яке називається його «коефіцієнтом квантування (QC)», а потім округлюється до цілого числа. Це місце, де інформація втрачається безповоротно, великий контроль якості спричиняє ще більше втрат. Загалом, більшість програм JPEG дозволяють використовувати таблиці контролю якості, рекомендовані стандартом JPEG.
Кодування: 64 квантовані перетворені коефіцієнти (які тепер є цілими числами) кожного блоку даних кодуються за допомогою комбінації кодування RLE і Хаффмана.
Додавання заголовка: останній крок додає заголовок і всі використовувані параметри JPEG і виводить результат.
Декодер JPEG використовує дії у зворотному порядку, щоб створити оригінальне зображення зі стисненого.
Структура файлу
Зображення JPEG представляється як послідовність сегментів, де кожен сегмент починається з маркера. Кожен маркер починається з байта 0xFF, за яким слідує прапор маркера, що представляє тип маркера. Корисне навантаження, за яким слідує маркер, залежить від типу маркера. Поширені типи маркерів JPEG перераховані нижче:
Коротка назва | Байт | Корисне навантаження | Ім’я | Коментарі |
---|---|---|---|---|
SOI | 0xFF, 0xD8 | немає | Початок зображення | |
S0F0 | 0xFF, 0xC0 | розмір змінної | Початок кадру | |
S0F2 | 0xFF, 0xC2 | розмір змінної | Початок кадру | |
DHT | 0xFF, 0xC4 | розмір змінної | Визначити таблиці Хаффмана | |
DQT | 0xFF, 0xDB | розмір змінної | Визначити таблицю(и) квантування | |
DRI | 0xFF, 0xDD | 4 байти | Визначити інтервал перезапуску | |
SOS | 0xFF, 0xDA | розмір змінної | Початок сканування | |
RSTn | 0xFF, 0xD//n//(/uk//n//#0..7) | немає | Перезапустити | |
APPn | 0xFF, 0xE//n// | розмір змінної | специфічної програми | |
COM | 0xFF, 0xFE | розмір змінної | Коментар | |
EOI | 0xFF, 0xD9 | немає | Кінець зображення |
У ентропійно-кодованих даних після будь-якого байта 0xFF кодер вставляє байт 0x00 перед наступним байтом, щоб не було маркера там, де він не призначений, запобігаючи помилкам кадрування. Декодери повинні пропускати цей байт 0x00. Ця техніка, яка називається байтове наповнення (див. розділ F.1.2.3 специфікації JPEG), застосовується лише до ентропійно-кодованих даних, а не до даних корисного навантаження маркера . Зауважте, однак, що ентропійно-кодовані дані мають кілька власних маркерів; зокрема маркери скидання (від 0xD0 до 0xD7), які використовуються для ізоляції незалежних фрагментів ентропійно-кодованих даних для паралельного декодування, і кодери можуть вільно вставляти ці маркери скидання через регулярні проміжки часу (хоча не всі кодери роблять це).