Стиснення даних зображення. Групове кодування, вживане у файлах PCX, декілька відрізняється від розглянутого для файлів BMP
Групове кодування, вживане у файлах PCX, декілька відрізняється від розглянутого для файлів BMP. Зображення є видимим відрядковий зліва направо і зверху вниз. Групи пікселів одного кольору записуються двома байтами: перший байт містить кількість повторень і другий - значення кольору. На відміну від формату BMP, стисненню можуть бути піддані також і повнокольорові (true color) зображення. Вони представляються трьома колірними площинами, і кожен рядок розгортки зберігається послідовно по колірних площинах.
Ніяких команд, подібних тим, що передбачені в стандарті BMP, тут ні, так що кодування даних в стандарті PCX простіше.
Байт лічильника ідентифікується наявністю встановлених два старших битий, шість його молодших біт використовуються для представлення значення лічильника (від 1 до 63). Тобто, значення цього байта лежить між C0 і FF (числа шістнадцятиричні). Наступний за лічильником байт даних - це
значення яке повторюється в даних зображення стільки разів, скільки визначено значенням лічильника. Наприклад послідовність двадцяти байт із значенням 1с запишеться двома байтами: "D4 1с".
Якщо в рядку зображення міститься одиночний байт, колір якого відрізняється від квітів сусідів, він зберігається в стислих даних без зміни. Проте, так поступають тільки тоді, коли його значення менше C0, інакше не можна буде зрозуміти це одиночний байт або повторітель. Тому одиночний байт більший BF записується з повторітелем рівним одиниці. Наприклад, байт із значенням C0 запишеться двобайтовою послідовністю "С1 С0".
Кодування даних зображення виконується відрядковий зверху вниз слідуючи порядку рядків розгортки, збережених в буфері пам'яті адаптера дисплея. Поточний рядок розгортки кодується для кожного колірного площини побайтно. Для 24-бітових зображень, які мають три колірні площині необхідно доповнювати нулями кожну колірну площину рядка розгортки до межі двобайтового слова. Для 16-кольорових зображень які мають чотири колірні площини це робити не обов'язково. Елемент заголовка "число байтів на площину рядка розгортки" (bplin) допоможе визначити, виконувалося вирівнювання чи ні.
Декодування зображення із стислих даних виконується відрядковий. При цьому треба враховувати дві обставини:
1) кожен рядок може мати декілька колірних площин;
2) кожен з рядків, а для 24-бітових зображень і кожна з колірних площин вирівнюється на границю слова.
У декодуючій функції необхідно виділити для буфера розпаковуваної рядки місце, з урахуванням можливого вирівнювання, а відображати на екрані його частину, визначену по розмірах зображення, узятих із заголовка тобто x2-x1+1. Аналогічно визначається і правильна кількість рядків в зображенні: y2-y1+1.
При декодуванні перевіряється кожен байт стислих даних зображення. Якщо два старших біта байта встановлені, молодші шість бітів указують скільки разів потрібно повторити наступний байт в буфері рядка. Якщо старші біти не встановлені, тобто значення байта менше С0, то в буфер рядка
копіюється сам цей байт (один раз). Поточний рядок розгортки закінчений коли число байт в буфері рядка дорівнює розміру буфера. Розмір буфера як ви пам'ятаєте, парний і тому рівний або на один байт більше довжини рядки.
Якщо зображення містить більш ніж одну колірну площину, то декодується послідовно кожна площина. Порядок в якому вони записані залежить від пристрою. Наприклад, адаптери EGA має чотири колірні площини в такому порядку: синій, зелений, червоний і інтенсивність. Повнокольорові (true color) зображення представляються трьома колірними площинами в іншому порядку: червоний, зелений, синій.
Декодування уривається в кінці кожного рядка. Тобто, пара закодованих байт може представляти безперервну послідовність байтів тільки в межах одного рядка. Проте, це зовсім не обов'язково для колірних площин. Закодована парою байт безперервна послідовність однакових значень може переходити з однієї колірної площини рядка зображення, що виводиться, в іншу. Наприклад, рядок представлена чотирма колірними площинами:
00 00 01 01 01 01 00 00
00 01 01 01 01 01 00 00
00 00 00 01 01 00 00 00
00 20 20 20 20 20 00 00
може бути закодована як з розбиттям на колірні площини
C2 00 C4 01 C2 00
00 C5 01 C2 00
C3 00 C2 01 C2 00
00 C5 20 C2 00
так і без
C2 00 C4 01 C3 00
C5 01 C5 00
C2 01 C3 00
C5 20 C2 00.
Файли *.jpg
Розглянемо тепер один з найновіших форматів файлів зображень - JPEG (вимовляється джей-пег), стандарт якого склався в нинішньому вигляді у 1991 році, і який зараз є чи не найпоширенішим. Назва стандарту JPEG відбулася від назви організації, яка цей стандарт розробила і активно пропагує: "Об'єднана Група Експертів в області Фотографії". Початкові букви англійської назви "Joint Photographic Experts Group" і утворюють це саме слово - JPEG.
Необхідність створення нового формату була викликана тим, що файли зображень мають, як правило, великі розміри, і для їх зберігання і пересилки по каналах комп'ютерного зв'язку потрібні величезні ресурси. Так наприклад, зображення розміром 1280х1024 піксела вимагає майже 4 мегабайта. Навіть якщо залишити в палітрі всього 256 квітів і стиснути таке зображення одним з найбільш могутніх способом - за стандартом LZW (Лемпель-зіва-уелча), то розмір отриманого файлу все одно буде вимірюватися сотнями кілобайт.
Джерелами високоякісних статичних комп'ютерних зображень є фотографії і слайди. Саме тому розробкою стандарту стиснення комп'ютерних зображень зайнялася "Об'єднана Група Експертів в області Фотографії", яка, як можна вирішити з назви, не винна мати відношення до комп'ютерних зображень. І, треба сказати, вони в цьому справі вельми досягли успіху. Якщо розглянуті нами методи групового кодування дозволяли стискати зображення в 2-3 рази, а згадуваний стандарт LZW - в 5-6 разів, то для Jpegа рядовим вважається стиснення в 20-30 раз, а в деяких випадках допустиме стиснення в 100 разів і навіть більше.
Така різна ефективність стиснення пояснюється тим, що традиційні методи виконують так зване стиснення без втрати даних: файл після відновлення виявляється ідентичним початковому файлу. Стандарт JPEG визначає метод стиснення з втратами - деякі параметри зображення в процесі стиснення втрачаються і при зворотному перетворенні не відновлюються. Це може показатися серйозною неприємністю, проте в дійсності принцип роботи алгоритму JPEG полягає у відкиданні даних, які не мають істотного значення для візуального сприйняття зображення. Такий підхід дозволяє досягти дуже високих ступенів стиснення, перш ніж погіршення якості зображення стане помітним. При стисненні в 20-30 разів якість відновленого зображення настільки добре, що візуально його не вдається відрізнити від оригіналу.