Переглядаючи жорсткий диск типового ПК, ви майже напевно знайдете багато файлів з розширеннями BMP і PCX. Цілком ймовірно, ці файли містять растрові графічні зображення. Це тільки два представника великого сімейства форматів графічних файлів, які використовуються на персональних комп'ютерах. Кожен з цих форматів по різному зберігає графічну інформацію, і кожен з них розроблявся під конкретну мету.
Розширення в імені файлу говорить про те, в якому форматі зберігається інформація. Наприклад, розширення BMP позначає BMP-файл, підтримуваний в системах Windows і OS / 2 (BMP - скорочення від bitmap, тобто бітовий, растровий). Формат файлу BMP - це "рідний" формат растрової графіки для Windows, оскільки він найближче відповідає внутрішньому формату Windows, в якому ця система зберігає свої растрові масиви.
Формат PCX став першим стандартним форматом графічних файлів для зберігання файлів растрової графіки в комп'ютерах IBM PC. Формат PCX спочатку був придуманий для зберігання чорно-білих графічних файлів, що створюються ранньою версією програми розмальовки PC Paintbrush. На цей формат на початку 80-х рр. фірмою Microsoft була придбана ліцензія, і потім він поширювався разом з виробами Microsoft. Надалі формат був перетворений в WindowsPaintbrush і почав поширюватися з Windows. Хоча область застосування цього популярного формату скорочується, файли формату PCX, які легко дізнатися по розширенню PCX, все ще широко поширені сьогодні.
У растрових файлах використовується зазвичай один з двох методів зберігання даних про пікселах. У повнокольорових зображеннях піксел може приймати будь-яке з більш, ніж 16 мільйонів значень, тому і колір пікселя зберігається зазвичай як 24-розрядне значення - по 8 бітів на червону, зелену і синю компоненти кольору. Якщо зображення містить 1 мільйон пікселів, то розмір файлу буде дорівнює 3 мільйонам байтів плюс довжина неграфічних даних. Якщо ж зображення обмежена максимум 256 квітами, то колірна інформація зазвичай кодується з використанням палітри. Замість того, щоб зберігати значення кольору пікселя, інформація про піксель вказує на рядок в палітрі, а вона, в свою чергу, містить колір. Зі зменшенням кількості бітів, необхідних для представлення кольору пікселя, зменшується розмір файлу (а це в усі часи цінне придбання, оскільки простір пам'яті не буває безкоштовним).
Як приклад візьмемо зображення з мільйона пікселів, що містить 256 різних кольорів. Кодування кольору кожного пікселя 24-бітовим значенням приводить до марнотратною надмірності, тому що деякі (а можливо і все) з 256-ти кольорів повторюються неодноразово. Для зберігання використовуваних квітів краще виділити в файлі 768 байтів під колірну палітру: 256 полів по 24 біта, кожне поле містить один з кольорів, що зустрічаються в зображенні. Тоді під значення кольору пікселя можна відвести 8 бітів, тобто ціле число в діапазоні від 0 до 255, яке вказує номер кольору в палітрі. тепер для графічної частини файлу досить 1.000.768 байтів, проти колишніх 3.000.000 байтів, які потрібні для зберігання цього зображення без використання палітри. І навіть з урахуванням додаткових байтів з неграфічні частини файлу, ми все-таки отримуємо зменшення розміру файлу майже на дві третини.
У більшості форматів графічних файлів пікселі розташовуються через підрядник. Якщо розміри зображення 1000 на 1000 пікселів, і кожен піксель представляється 8-ю бітами, то першу 1000 байтів графічної частини файлу містять кольори пікселів з верхнього рядка зображення (зліва направо), наступні 1000 байтів містять кольори пікселів другого рядка і так далі. Однак, в деяких форматах використовується інший порядок рядків. Наприклад, BMP-файли починаються з нижнього рядка і закінчуються верхнім рядком зображення. У кожному форматі графічні і неграфічні дані структуруються по своєму.
Файли PCX розділені на наступні три частини: заголовок PCX, дані реєстрового масиву і факультативна таблиця кольорів. 128-байт заголовок PCX містить кілька полів, в тому числі поля розміру зображення і числа біт для кодування інформації про колір кожного пікселя. Інформація реєстрового масиву стискається з використанням простого методу стиснення RLE; факультативна таблиця кольорів в кінці файлу містить 256 значень кольорів RGB, що визначають кольори зображення. Формат PCX спочатку був розроблений для адаптерів CGA- і EGA-дисплеїв і в подальшому був модифікований для використання в адаптерах VGA і адаптери справжніх квітів. Кодування кольору кожного пікселя в сучасних зображеннях PCX може проводитися з глибиною 1, 4, 8 або 24 біт.
Тема файлаPCX (128 байт)
- Сигнатура файлу PCX (1 байт) - Постійний прапор 10 - ZSoft .PCX
- Версія. (1 байт) - (0 - Версія 2.5, 2 - Версія 2.8 з інформацією про палітру, 3 - Версія 2.8 без інформації про палітру, 5 - Версія 3.0).
- Кодування. (1 байт) - (1 - кодування довгими серіями).
- Біт / піксель (1 байт) - Число біт на піксель в шарі.
- Xmin (2 байт) - кутові координати зображення.
- Ymin (2 байт) - кутові координати зображення.
- Xmax (2 байт) - кутові координати зображення.
- Ymax (2 байт) - кутові координати зображення.
- Горизонтальна роздільна здатність створює пристрої (2 байт).
- Вертикальна роздільна здатність створює пристрої (2 байт).
- Набір кольорової палітри (48 байт).
- Не використовується (1 байт). Зарезервовано.
- Число колірних шарів (1 байт).
- Число байт на рядок в колірному шарі (2 байт).
- Інформація про палітру (2 байт) - (1 = кольорова / чорно-біла, 2 = градації сірого).
- Не використовується (58 байт). Заповнюється нулями до кінця заголовка.
Набір кольорової палітри.
Інформація палітри зберігається в одному з чотирьох форматів. Для режимів CGA, використовується тільки перший і четвертий байт палітри заголовка. Перший байт позначає колір заднього фону - розділивши його на 16 отримаємо величину від 0 до 15. Четвертий байт позначає колір переднього фону. Число палітр CGA дорівнює 8, тому розділимо на 32 щоб отримати величину в межах від 0 до 7.
Для режимів EGA, дані зберігаються в 16 "трійках". Трійка - це 3-байтовий набір величин червоного, зеленого і блакитного кольорів. Так як кожна величина може знаходитися в діапазоні від 0 до 255, Ви повинні відобразити ці величини в одному з чотирьох можливих рівнів-ній для кожного кольору. Отже, 256 розділити на 4 буде 64, тому з 0 до 63 = рівень 0, з 64 до 127 = рівень 1, і так да-леї. Система BIOS адаптера EGA очікує один байт формату 00RGBrgb для кажого регістра палітри. Четиремя можливими величинами для Bb є 00, 01, 10 і 11. Коли Ви визначили рівень для кожного кольору, скомбінуйте їх в байті, сумісному з BIOS (Базовою систе-мій введення-виведення).
Для 16-кольорових режимів VGA, палітра знову зберігається в "трой-ках". Для перетворення в сумісний формат BIOS, посуньте кожен байт вправо на два біта. Це перетворення автоматично виконуємо-ється функцією pcxGetFilePalette або функцією pcxDecodePalette.
Для доступу до 256-кольоровий палітрі слід: Прочитати в заголовку поле Version. Якщо воно дорівнює 5, палітра повинна бути. Або прочитати в заголовку поле число біт на піксель. Якщо воно дорівнює 8, 256-кольорова палітра повинна бить.Прочітать кінець файлу і відрахувати назад 769 байт. Знайдене вами значення має дорівнювати 12, що вказує на присутність 256-кольорової палітри.
Частина, що залишилася файлу із зображенням складається з закодованих графічних даних. При кодуванні використовується простий алгоритм, заснований на методі довгих серій. Якщо у файлі запам'ятовується кілька колірних шарів, кожен рядок зображення запам'ятовується по колірних шарах (в загальному випадку червоному-R, зеленого-G, синього-B і шару інтенсивності-I)
Метод кодування полягає в наступному:
ЯКЩО обидва старших біта X рівні 1, то
<повторитель> = 6 молодшим бітам X
<данные> = Наступного байту за X
Оскільки для насичення даного алгоритму потрібно в середньому 25% неповторяющихся даних і щонайменше наявність зсуву між повторюваними даними, то розмір одержуваного файлу, як правило виявляється прийнятним.
Формат графічних файлів - BMP широко використовується в системах Windows і OS / 2. Зокрема ми розглянемо BMP-файл, що описує 256-кольорове зображення розміром 1000 на 1000 пікселів. (Формат BMP-файлу трохи різниться в залежності від того скільки квітів містить зображення - 2, 16, 256 або 16,7 млн. Формати BMP в Windows і OS / 2 також трохи відрізняються. Опис цього файлу буде відповідати варіанту BMP для Windows.) У файлах BMP інформація про колір кожного пікселя кодується 1, 4, 8, 16 або 24 біт (біт / піксель). Числом біт / піксель, званим також глибиною уявлення кольору, визначається максимальне число кольорів в зображенні. Зображення при глибині 1 біт / піксель може мати всього два кольори, а при глибині 24 біт / піксель - більше 16 млн. Різних кольорів.
Файл складається з чотирьох основних частин: 14-байтного заголовка файлу, 40-байтного інформаційного заголовка, 1024-байтной колірної таблиці і мільйони байтів для значень пікселів. (Під колірну таблицю відводиться 1024 байти, а не 768, оскільки в кожне 24-бітове поле таблиці доданий ще один, не використовуваний байт.)
Структура графічного файлу форматаBMP.
1. Тема файлу растрової графіки (14 байт)
1.1. Сигнатура файлу BMP (2 байт)
1.2. Розмір файлу (4 байт)
1.3. Не використовується (2 байт)
1.4. Не використовується (2 байт)
1.5. Місцезнаходження даних растрового масиву (4 байт)
2. Інформаційний заголовок реєстрового масиву (40 байт)
2.1. Довжина цього заголовка (4 байт)
2.2. Ширина зображення (4 байт)
2.3. Висота зображення (4 байт)
2.4. Число колірних площин (2 байт)
2.5. Біт / піксель (2 байт)
2.6. Метод стиснення (4 байт)
2.7. Довжина реєстрового масиву (4 байт)
2.8. Горизонтальна роздільна здатність (4 байт)
2.9. Вертикальна роздільна здатність (4 байт)
2.10. Число кольорів зображення (4 байт)
2.11. Число основних кольорів (4 байт)
3. Таблиця кольорів (довжина змінюється від 8 до 1024 байт)
4. Власне дані реєстрового масиву (довжина змінна)
1. Перші 14 байтів BMP-файлу складають його заголовок. Тема файлу містить три значення: літери BM, які говорять про те, що графічний файл має BMP формат, число, що означає розмір файлу і число, яке вказує на те, де знаходяться растрові дані. Останнє число дорівнює кількості байтів від початку файлу. Ще два поля в заголовку файлу зарезервовані для майбутніх потреб і зазвичай містять нулі.
2. Необхідні неграфічні дані сховані в інформаційному заголовку. Поля в інформаційному заголовку в числі інших містять його розмір (40 байтів в BMP-файлах для Windows), висоту і ширину зображення в пікселях, і кількість бітів на піксель. Залежно від способу кодування поле біт на піксель, може приймати значення:
1 - бітовий образ монохромний, і таблиця кольорів повинна містити два елементи. Кожен біт в масиві даних кодує один піксель. Якщо значення біта - 0, то піксель стає першим кольором таблиці; якщо - 1, піксель стає другим кольором таблиці.
4 - бітовий образ має максимум 16 кольорів, і таблиця кольорів має до 16 елементів. Колір кожного пікселя визначається по таблиці квітів за допомогою четирехбітних індексу. Наприклад, якщо перший байт даних має значення 3Ah, то при відображенні бітового образу колір першого пікселя визначає четвертий елемент таблиці кольорів, а колір другого - одинадцятий.
8 - бітовий образ має максимум 256 кольорів, і таблиця кольорів має до 256 елементів. Кожен байт масиву даних визначає колір одного пікселя.
24 - бітовий образ має максимум 2 в 24-й ступеня квітів. Таблиця кольорів порожня, а колір пікселів визначається пакетами з трьох байтів, що описують колірні інтенсивності червоного, зеленого і блакитного кольорів.
3. Колірна таблиця містить 256 полів по 4 байта. перший байт в кожному полі відповідає за синю компоненту кольору, другий за зелену і третій - за червону. Четвертий байт не використовується і зазвичай встановлюється в 0. Якщо перші три значення в колірній таблиці 0, 192 і 192, це означає, що нульовий номер відповідає жовтому кольору середньої інтенсивності (суміш зеленого і червоного). У колірній таблиці визначені всі кольори, що використовуються в зображенні.
4. Решта файлу містить значення пікселів. Послідовність байтів відповідає порядку пікселів в зображенні: зліва направо, починаючи з нижнього рядка зображення. Значення кожного байта є номер кольору в колірній таблиці. Формат власне даних растрового масиву в файлі BMP залежить від числа біт, що використовуються для кодування даних про колір кожного пікселя. При 256-кольоровому зображенні кожен піксель в тій частині файлу, де містяться власне дані реєстрового масиву, описується одним байтом (8 біт). Це опис пікселя не представляє значний квітів RGB, а слугує дороговказом для входу в таблицю кольорів файлу. Таким чином, якщо в якості першого значення кольору RGB в таблиці кольорів файлу BMP зберігається R / G / B = 255/0/0, то значенням пікселя 0 в растровому масиві буде поставлений у відповідність яскраво-червоний колір. Значення пікселів зберігаються в порядку їх розташування зліва направо, починаючи (як правило) з нижнього рядка зображення. Таким чином, в 256-кольоровому BMP-файлі перший байт даних растрового масиву представляє собою індекс для кольору пікселя, що знаходиться в нижньому лівому кутку зображення; другий байт представляє індекс для кольору сусіднього справа пікселя і т. д. Якщо число байт в кожному рядку непарній, то до кожного рядка додається додатковий байт, щоб вирівняти дані реєстрового масиву по 16-біт кордонів.
Не всі файли BMP мають структуру, подібну показаної на схемі. Наприклад, файли BMP з глибиною 16 і 24 біт / піксель не мають таблиць кольорів; в цих файлах значення пікселів растрового масиву безпосередньо характеризують значення кольорів RGB. Також можуть відрізнятися внутрішні формати зберігання окремих розділів файлу. Наприклад, інформація растрового масиву в деяких 16 і 256-кольорових BMP-файлах може стискуватися за допомогою алгоритму RLE, який замінює послідовності ідентичних пікселів зображення на лексеми, що визначають число пікселів в послідовності і їх колір. У Windows допускається робота з BMP-файлами стилю OS / 2, в яких використовуються різні формати інформаційного заголовка реєстрового масиву і таблиці кольорів.
Після запуску програми PCX_BMP.EXE <имя графического файла> стандартна функція Fnsplit розбиває повне ім'я файлу на 4 частини. Що дає можливість передати файли з розширеннями PCX і BMP на обробку функцій виведення графічних файлів на екран (show_pcx і show_bmp).
Висновок на екран картинки, що зберігається в PCX-файлі, починається з читання заголовка файлу. За допомогою цього визначається чи є цієї файл форматом PCX (manufacturer має дорівнювати 10), розміри зображення, інформації про палітру, число колірних шарів. Після чого відбувається перехід на 768 байт з кінця файлу для читання набору кольорової палітри і за допомогою функції Set_palette заповнення кольорової палітри значеннями.
Висновок на екран картинки, що зберігається в BMP-файлі, починається з читання заголовка файлу і інформаційного заголовка. Програма таким чином перевіряє чи є цей файл графічно форматом BMP (сигнатура повинна бути 'BM') а так же дізнається розміри зображення і кількість квітів.
Потім програма читає колірну таблицю. Після чого програма за допомогою функції Set_palette заповнює колірну палітру значеннями з колірною таблиці. Таким чином, забезпечується правильна передача кольорів картинки. Якщо комп'ютер здатний відобразити тисячі або мільйони квітів одночасно, то колірну палітру заповнювати не потрібно.
char far * video = (char far *) 0xA0000000L