Какво е JPEG файл?
JPEG е вид формат на изображение, който се записва с помощта на метода на компресия със загуби. Изходното изображение, като резултат от компресията, е компромис между размера на паметта и качеството на изображението. Потребителите могат да регулират нивото на компресия, за да постигнат желаното ниво на качество, като в същото време намалят размера на паметта. Качеството на изображението се повлиява незначително, ако към изображението се приложи компресия 10:1. Колкото по-висока е стойността на компресия, толкова по-голямо е влошаването на качеството на изображението.
Спецификации на файловия формат
JPEG файловият формат на изображението е стандартизиран от Joint Photographic Experts Group и оттам идва името JPEG. Форматът е изборът за съхранение и предаване на фотографски изображения в мрежата. Почти всички операционни системи вече имат визуализатори, които поддържат визуализация на JPEG изображения, които често се съхраняват и с JPG разширение. Дори уеб браузърите поддържат визуализация на JPEG изображения. Преди да преминем към спецификациите на JPEG файловия формат, трябва да се спомене цялостният процес от стъпки, включени в създаването на JPEG.
Стъпки за компресиране на JPEG
Трансформация: Цветните изображения се трансформират от RGB в изображение на яркост/цветност (Окото е чувствително към яркост, а не към цветност, така че частта от цветността може да загуби много данни и по този начин може да бъде силно компресирана.
Намаляване на пробите: Намаляването на пробите се извършва за цветен компонент, а не за компонент на осветеност. Намаляването на пробите се извършва в съотношение 2:1 хоризонтално и 1:1 вертикално (2h 1 V). По този начин изображението намалява по размер, тъй като компонентът „y“ не се докосва, няма забележима загуба на качество на изображението.
Организиране в групи: Пикселите на всеки цветен компонент са организирани в групи от 8×2 пиксела, наречени „единици за данни“, ако броят на редовете или колоните не е кратен на 8, долният ред и най-десните колони се дублират.
Дискретна косинусова трансформация: След това към всяка единица данни се прилага дискретна косинусова трансформация (DCT), за да се създаде карта 8×8 на трансформирани компоненти. DCT включва известна загуба на информация поради ограничената точност на компютърната аритметика. Това означава, че дори и без картата ще има известна загуба на качество на изображението, но тя обикновено е малка.
Квантуване: Всеки от 64-те трансформирани компонента в единицата данни се разделя на отделно число, наречено негов „Коефициент на квантуване (QC)“ и след това се закръгля до цяло число. Това е мястото, където информацията се губи безвъзвратно, големият QC причинява повече загуби. Като цяло повечето JPEG приложения позволяват използването на QC таблици, препоръчани от стандарта JPEG.
Кодиране: 64-те квантувани трансформирани коефициента (които сега са цели числа) на всяка единица данни са кодирани с помощта на комбинация от RLE и кодиране на Huffman.
Добавяне на заглавка: Последната стъпка добавя заглавка и всички използвани JPEG параметри и извежда резултата.
JPEG декодерът използва стъпките в обратен ред, за да генерира оригиналното изображение от компресираното.
Файлова структура
JPEG изображение се представя като поредица от сегменти, където всеки сегмент започва с маркер. Всеки маркер започва с 0xFF байт, последван от флаг на маркера, за да представи типа на маркера. Полезният товар, последван от маркер, е различен според типа маркер. Често срещаните типове JPEG маркери са изброени по-долу:
Кратко име | Байтове | Полезен товар | Име | Коментари |
---|---|---|---|---|
SOI | 0xFF, 0xD8 | няма | Начало на изображението | |
S0F0 | 0xFF, 0xC0 | променлив размер | Начало на рамка | |
S0F2 | 0xFF, 0xC2 | променлив размер | Начало за рамка | |
DHT | 0xFF, 0xC4 | размер на променлива | Дефиниране на таблици на Huffman | |
DQT | 0xFF, 0xDB | размер на променлива | Дефиниране на таблица(и) за квантуване | |
DRI | 0xFF, 0xDD | 4 байта | Определяне на интервал за рестартиране | |
SOS | 0xFF, 0xDA | променлив размер | Начало на сканиране | |
RSTn | 0xFF, 0xD//n//(/bg//n//#0..7) | няма | Рестартиране | |
APPn | 0xFF, 0xE//n// | променлив размер | Специфично приложение | |
COM | 0xFF, 0xFE | размер на променлива | Коментар | |
EOI | 0xFF, 0xD9 | няма | Край на изображението |
В рамките на ентропийно кодираните данни, след всеки байт 0xFF, байт 0x00 се вмъква от енкодера преди следващия байт, така че да не изглежда да има маркер там, където не е предназначен, предотвратявайки грешки при рамкиране. Декодерите трябва да пропускат този 0x00 байт. Тази техника, наречена byte stuffing (вижте JPEG спецификация, раздел F.1.2.3), се прилага само към ентропийно кодираните данни, а не към маркерни данни за полезен товар . Имайте предвид обаче, че ентропийно кодираните данни имат няколко собствени маркера; по-специално маркерите за нулиране (0xD0 до 0xD7), които се използват за изолиране на независими части от ентропийно кодирани данни, за да се позволи паралелно декодиране, и енкодерите са свободни да вмъкват тези маркери за нулиране на редовни интервали (въпреки че не всички енкодери правят това).