Учебная работа. Реферат: Просмотрщик графических файлов. Форматы PCX и BMP
УНИВЕРСИТЕТ
РОСКОМРЫБОЛОВСТВА
Институт информационных технологий и коммуникаций
Кафедра
Информационных
систем
КУРСОВАЯ РАБОТА
по дисциплине «Базы алгоритмического языка
C++»
на тему «Просмотрщик графических файлов. Форматы
PCX и
BMP»
Выполнил:
студент
группы ЗИУ–31
Андросов О.В.
98 ИУ-022
Проверил:
доцент Миронов Б.Н.
Рецензент:
доцент Лаптев В.В.
Астрахань, 2001 год
Содержание
Введение.3
1. Форматы графических файлов.4
1.1. Общие принципы строения графических файлов.4
1.2. Описание и структура файла формата PCX.4
1.3. Описание и структура файла формата BMP.6
2. Описание программки.9
2.1. Реализация метода просмотра файла PCX.9
2.2. Реализация метода просмотра файла BMP.9
2.3. Применяемые переменные и функции.9
2.3.1. Глобальные переменные.9
1.3.2. Главные функции и процедуры10
2.4. Пуск программки11
2.5. Содержание дистрибутивной дискеты11
СПИСОК ЛИТЕРАТУРЫ12
приложение13
Листинг программки “Просмотрщик графических файлов”.13
Введение.
Просматривая твердый диск обычного ПК , вы практически наверное отыщите много файлов с расширениями 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, все еще обширно всераспространены сейчас.
1. Форматы графических файлов.
1.1. Общие принципы строения графических файлов.
Что содержит растровый графический файл? Таковой файл обычно содержит информацию 2-ух видов: графическую и неграфическую. В графических данных указываются цвета пикселов, неграфические данные содержат другую информацию, нужную для восстановления изображения, к примеру его высоту и ширину. (Если изображение содержит 1 миллион пикселов, то как графической программке выяснить размеры: отрисовывать ли ей изображение 500 на 2000 либо 1000 на 1000 пикселов?) Неграфическая часть файла может также включать другую информацию, такую как номер версии либо сведения о авторских правах. Все зависит от формата и от того кто (либо какой программный пакет) сделал этот файл.
В растровых файлах употребляется обычно один из 2-ух способов хранения данных о пикселах. В полноцветных изображениях пиксел может принимать хоть какое из наиболее, чем 16 миллионов значений, потому и цвет пиксела хранится обычно как 24-разрядное цвета. Если изображение содержит 1 миллион пикселов, то размер файла будет равен 3 миллионам байтов плюс длина неграфических данных. Если же изображение ограничено 256 либо наименее цветами, то цветовая информация обычно кодируется с внедрением палитры. Заместо того, чтоб хранить цвет. С уменьшением количества битов, требуемых для представления цвета пиксела, миниатюризируется размер файла (а это во все времена ценное приобретение, так как место памяти не бывает бесплатным).
В качестве примера возьмем изображение из миллиона пикселов, содержащее 256 разных цветов. Кодирование цвета всякого пиксела 24-битным значением пpиводит к расточительной избыточности, поэтому что некие (а может быть и все) из 256-ти цветов повторяются не один раз. Для хранения применяемых цветов лучше выделить в файле 768 байтов под цветовую гамму: 256 полей по 24 бита, каждое поле содержит один из цветов, встречающихся в изображении. Тогда под цвета в гамме. сейчас для графической части файла довольно 1.000.768 байтов, против прежних 3.000.000 байтов, которые требуются для хранения этого изображения без использования палитры. И даже с учетом доп байтов из неграфической части файла, мы все-же получаем уменьшение размера файла практически на две третьих.
В большинстве форматов графических файлов пикселы размещаются построчно. Если размеры изображения 1000 на 1000 пикселов, и любой пиксел представляется 8-ю битами, то 1-ые 1000 байтов графической части файла содержат цвета пикселов из верхней строчки изображения (слева вправо), последующие 1000 байтов содержат цвета пикселов 2-ой строчки и так дальше. Но, в неких форматах употребляется другой порядок строк. К примеру, BMP-файлы начинаются с нижней строчки и завершаются верхней строчкой изображения. В любом формате графические и неграфические данные структурируются по собственному.
1.2. Описание и структура файла формата
PCX.
Файлы PCX разбиты на последующие три части: заголовок PCX, данные растрового массива и факультативная таблица цветов. 128-б заголовок PCX содержит несколько полей, в том числе поля размера изображения и числа бит для кодировки инфы о цвете всякого пиксела. информация растрового массива сжимается с внедрением обычного способа сжатия RLE; факультативная таблица цветов в конце файла содержит 256 значений цветов RGB, определяющих цвета изображения. Формат PCX сначало был разработан для адаптеров CGA- и EGA-дисплеев и в предстоящем был изменен для использования в адаптерах VGA и адаптерах настоящих цветов. Кодирование цвета всякого пиксела в современных изображениях PCX может выполняться с глубиной 1, 4, 8 либо 24 бит.
Заголовок файла
PCX (128 б)
Набор палитры цветов.
информация палитры хранится в одном из 4 форматов. Для режимов CGA, употребляется лишь 1-ый и 4-ый б палитры заголовка. 1-ый б обозначает цвет заднего фона — разделив его на 16 получим величину от 0 до 15. 4-ый б обозначает цвет фронтального фона. Число палитр CGA равно 8, потому разделим на 32 чтоб получить величину в границах от 0 до 7.
Для режимов EGA, данные хранятся в 16 «тройках». Тройка — это 3-байтовый набор величин красноватого, зеленоватого и голубого цветов. Потому что любая величина может находиться в спектре от 0 до 255, Вы должны показать эти величины в одном из 4 вероятных уровней для всякого цвета. Как следует, 256 поделить на 4 будет 64, потому с 0 до 63 = уровень 0, с 64 до 127 = уровень 1, и так далее. Система ==BIOS адаптера EGA ждет один б формата 00RGBrgb для кажого регистра палитры. Четыремя вероятными величинами для Bb являются 00, 01, 10 и 11. Когда Вы обусловили уровень для всякого цвета, скомбинируйте их в б, совместимом с BIOS (Базисной системой ввода-вывода).
Для 16-цветных режимов VGA, гамма опять хранится в «тройках». Для преобразования в совместимый формат BIOS, сдвиньте любой б на право на два бита. Это преобразование автоматом выполняется функцией pcxGetFilePalette либо функцией pcxDecodePalette.
И крайний формат поддерживает 256-цветный режим VGA. Потому что любой цвет просит тройку RGB (R (red)- Красноватый, G (green) — зеленый, B (blue) — голубой), для хранения всей палитры VGA будет необходимо 768 б. формат PCX, но, может поддерживать лишь 16 цветов как максимум, потому гамма не может храниться в заголовке изображения по собственному обыкновенному адресу.
формат 256-цветной палитры перетерпел не достаточно конфигураций с того времени, когда были в первый раз сделаны 256-цветные режимы. Заголовок PCX был вначале сотворен для хранения 16 цветов как максимум, и длина его составляет всего 128 б. Для 256-цветной палитры требуется 768 б (3 помножить на 256) — разумеется, что нужно внести изменение. 256-цветная гамма форматируется и интерпретируется буквально также, как 16-цветная, естественно, кроме того, что она длиннее. Гамма (число цветов x 3 б длины) добавляется в конец PCX файла и ей предшествует б с десятичным значением 12. Для определения палитры VGA =BIOS для вас довольно поделить прочитанные значения цветов на 4.
Для доступа к 256-цветной гамме следует: Прочесть в заголовке поле Version. Если оно равно 5, гамма обязана быть. Либо прочесть в заголовке поле число бит на пиксел. Если оно равно 8, 256-цветная гамма обязана быть.Прочесть конец файла и отсчитать вспять 769 б. Отысканное вами
Оставшаяся часть файла с изображением состоит из закодированных графических данных. При кодировке употребляется обычной метод, основанный на способе длинноватых серий. Если в файле запоминается несколько цветовых слоев, любая строчка изображения запоминается по цветовым слоям (в общем случае красному-R, зеленому-G, синему-B и слою интенсивности-I)
способ кодировки состоит в последующем:
ДЛЯ всякого б X, прочитанного из файла
ЕСЛИ оба старших бита X равны 1, то
<повторитель> = 6 младшим битам X
<данные> = последующему б за X
ИНАЧЕ
<повторитель> = 1
<данные> = X
Так как для насыщения данного метода требуется в среднем 25% неповторяющихся данных и по наименьшей мере наличие смещения меж циклическими данными, то размер получаемого файла, как правило оказывается применимым.
1.3. Описание и структура файла формата
BMP.
формат графических файлов — 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 млн. разных цветов.
файл состоит из 4 главных частей: 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. 1-ые 14 байтов BMP-файла составляют его заголовок. Заголовок файла содержит три значения: буковкы BM, которые молвят о том, что графический файл имеет BMP формат, число, значащее размер файла и число, указывающее на то, где находятся растровые данные. Крайнее число равно количеству байтов от начала файла. Еще два поля в заголовке файла зарезервированы для будущих нужд и обычно содержат нули.
2. Нужные неграфические данные упрятаны в информационном заголовке. Поля в информационном заголовке в числе иных содержат его размер (40 байтов в BMP-файлах для Windows), высоту и ширину изображения в пикселах, и количество битов на пиксел. Зависимо от метода кодировки поле бит на пиксел, может принимать значения:
1 — битовый образ монохромный, и таблица цветов обязана содержать два элемента. Любой бит в массиве данных шифрует один пиксел. Если
4 — битовый образ имеет максимум 16 цветов, и таблица цветов имеет до 16 частей. цвет всякого пиксела определяется по таблице цветов с помощью четырехбитного индекса. к примеру, если 1-ый б данных имеет цвет первого пиксела описывает 4-ый элемент таблицы цветов, а цвет второго — одиннадцатый.
8 — битовый образ имеет максимум 256 цветов, и таблица цветов имеет до 256 частей. Любой б массива данных описывает цвет 1-го пиксела.
24 — битовый образ имеет максимум 2 в 24-й степени цветов. Таблица цветов пуста, а цвет пикселов определяется пакетами из 3-х байтов, описывающими цветовые интенсивности красноватого, зеленоватого и голубого цветов.
3. Цветовая таблица содержит 256 полей по 4 б. 1-ый б в любом поле отвечает за голубую компоненту цвета, 2-ой за зеленоватую и 3-ий — за красноватую. 4-ый б не употребляется и обычно устанавливается в 0. Если 1-ые три значения в цветовой таблице 0, 192 и 192, это означает, что нулевой номер соответствует желтоватому цвету средней интенсивности (смесь зеленоватого и красноватого). В цветовой таблице определены все цвета, использующиеся в изображении.
4. Остальная часть файла содержит значения пикселов. Последовательность байтов соответствует порядку пикселов в изображении: слева вправо, начиная с нижней строчки изображения. формат фактически данных растрового массива в файле BMP зависит от числа бит, применяемых для кодировки данных о цвете всякого пиксела. При 256-цветном изображении любой пиксел в той части файла, где содержатся фактически данные растрового массива, описывается одним б (8 бит). Это описание пиксела не представляет значений цветов RGB, а служит указателем для входа в таблицу цветов файла. Таковым образом, если в качестве первого значения цвета RGB в таблице цветов файла BMP хранится R/G/B=255/0/0, то значению пиксела 0 в растровом массиве будет поставлен в соответствие ярко-красный цвет. Значения пикселов хранятся в порядке их расположения слева вправо, начиная (как правило) с нижней строчки изображения. Таковым образом, в 256-цветном BMP-файле 1-ый б данных растрового массива представляет собой индекс для цвета пиксела, находящегося в нижнем левом углу изображения; 2-ой б представляет индекс для цвета примыкающего справа пиксела и т. д. Если число б в каждой строке нечетно, то к каждой строке добавляется доп б, чтоб выровнять данные растрового массива по 16-бит границам.
Не все файлы BMP имеют структуру, схожую показанной на схеме. к примеру, файлы BMP с глубиной 16 и 24 бит/пиксел не имеют таблиц цветов; в этих файлах значения пикселов растрового массива конкретно охарактеризовывают значения цветов RGB. Также могут различаться внутренние форматы хранения отдельных разделов файла. к примеру, информация растрового массива в неких 16 и 256-цветных BMP-файлах может сжиматься средством метода RLE, который подменяет последовательности схожих пикселов изображения на лексемы, определяющие число пикселов в последовательности и их цвет. В Windows допускается работа с BMP-файлами стиля OS/2, в каких употребляются разные форматы информационного заголовка растрового массива и таблицы цветов.
2. Описание программки.
Опосля пуска программки PCX_BMP.EXE <имя графического файла> обычная функция Fnsplit разбивает полное имя файла на 4 части. Что дает возможность передать файлы с расширениями PCX и BMP на обработку функциям вывода графических файлов на экран (show_pcx и show_bmp).
2.1. Реализация метода просмотра файла
PCX.
Вывод на экран рисунки, лежащей в PCX-файле, начинается с чтения заголовка файла. При помощи этого определяется является ли данной нам файл форматом PCX (manufacturer должен быть равен 10), размеры изображения, инфы о гамме, число цветовых слоев. Опосля что происходит переход на 768 б с конца файла для чтения набора палитры цветов и при помощи функции Set_palette наполнение палитры цветов значениями.
сейчас начинается декодирование первой строчки развертки — прочитывается 1-ый б данных из файла. Если два старших бита этого б равны 1, оставшиеся 6 битов демонстрируют сколько раз следует повторить последующий б из файла. Если это не так, то этот б сам является данными с повторителем равным 1. Продолжайте декодирование до конца строчки, ведя подсчет количества байтов, переданных в буфер вывода. В конце каждой строчки развертки имеет пространство остановка метода кодировки, но ее не существует при переходе от 1-го слоя к другому. Как строчка со значениями пикселов прочитана из файла, она в функции put_Pixel передается в видео-буфеp для получения изображения на дисплее.
2.2. Реализация метода просмотра файла
BMP.
Вывод на экран рисунки, лежащей в BMP-файле, начинается с чтения заголовка файла и информационного заголовка. программка таковым образом инспектирует является ли этот файл графически форматом BMP (сигнатура обязана быть ‘BM’) а так же выяснит размеры изображения и количество цветов.
Потом программка читает цветовую таблицу. Опосля что программка при помощи функции Set_palette заполняет цветовую гамму значениями из цветовой таблицы. Таковым образом, обеспечивается верная передача цветов рисунки. Если комп способен показать тыщи либо миллионы цветов сразу, то цветовую гамму заполнять не необходимо.
Последующим шагом происходит считывание растровые данные из файла. Как строчка со значениями пикселов прочитана из файла, она в функции put_Pixel передается в видео-буфеp для получения изображения на дисплее.
2.3. Применяемые переменные и функции.
2.3.1. Глобальные переменные.
typedefunsignedcharbyte
Объявление типа.
char far *video = (char far *) 0xA0000000L
Указатель на видеопамять.
intMaxX, MaxY
Наибольшее разрешение экрана.
VidMode=0x13
Гафический режим 13h.
1.3.2. Главные функции и процедуры
structpcxHeaderType
структура заголовка файла PCX.
struct bmpHeaderType
Структура заголовка файла BMP.
voidset_mode (void)
установка графического режима 13h.
voidset_text (void)
Установкатекстовогорежимa.
void set_palette (int color, byte r, byte g, byte b)
установление цвета в гамме.
voidput_pixel (intx, inty, bytecolor)
Вывод пиксела установленного цвета в позицию x y.
void read_pcx_header (FILE *dataFile, pcxHeaderType &pcxHeader)
Чтениезаголовка pcx файла.
int show_pcx (char *name)
Вывод pcx файла на экран.
void read_bmp_header (FILE *dataFile, bmpHeaderType &bmpHeader)
Чтениезаголовка bmp файла.
void read_bmp_header (FILE *dataFile, bmpHeaderType &bmpHeader)
Чтениезаголовка bmp файла.
int show_bmp (char *name)
Вывод bmp файла на экран.
void main(int argc, char *argv[])
Читает имя файла из командной строчки, инспектирует по расширению к какому типу файлов он относится и вызывает подобающую функция просмотра.
2.4. Пуск программки
программка является консольным приложением и работает под управлением операционной системы MSDOS либо её эмуляции («Сеанс MSDOS» в Windows’е).
Пуск программки делается из окна файлового менеджера, или из командной строчки, и имеет последующий синтаксис:
PCX_BMP.EXE <имя графического файла>[PCX]/[BMP]
Примеры:
PCX_BMP.EXETEST.PCX
PCX_BMP.EXETEST.BMP
При запуске программки следует направить внимание на то, что если не указывать имя файла то на экран будет выдана подсказка по формату пуска программки.
2.5. Содержание дистрибутивной дискеты
Дискета с дистрибутивом содержит последующие файлы:
В каталоге DEMO находится файл главный запускающей программки PCX_BMP.EXE.
В каталоге SOURCE находятся файл PCX_BMP.cpp — начальный текст программки, написанный на языке С++.
В каталоге DOC находится файл Viewer.doc — описание метода и работы программки просмотра графических файлов.
В каталоге TEST находятся тестовые графические файлы.
TEST.BMP – графический файл формата BMP (320×200)
TEST.PCX – графический файл формата PCX (320×200)
TEST2.BMP – графический файл формата BMP (224×160)
TEST2.PCX – графический файл формата PCX (256×160)
TEST3.BMP – графический файл формата BMP (320×22)
TEST3.PCX – графический файл формата PCX (200×125)
В корневом каталоге дискеты находится файл Read.me.
СПИСОК ЛИТЕРАТУРЫ
ПРИЛОЖЕНИЕ
Листинг программки
“Просмотрщик графических файлов”.
#include <dos.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <dir.h>
// Глобальные переменные
typedef unsigned char byte; // объявлениетипа
char far *video = (char far *) 0xA0000000L; // указатель на видеопамять
int MaxX=320, MaxY=200, VidMode=0x13; // Наибольшее разрешение экрана
// структура заголовка файла PCX
struct pcxHeaderType
{
charmanufacturer; // постоянно 10 для Paintbrush
char version; // информация о версии (версия 5)
char encoding; // групповое кодирование (=1)
char bitsPerPixel; // число бит на пиксел
int x, y; // координаты левого верхнего угла
int width, height; // размеры изображения
int hResolution, vResolution; // горизонтальное и вертикальное разрешение экрана
char egaPalette[48]; // гамма 256 цветов
char reserved; // зарезервировано постоянно 0
char nColorPlanes; // число цветовых слоев
int bytesPerLine; // число б на строчку в цветном слое
int paletteType; // определение палитры (1-цветная/черно-белая, 2-градация сероватого)
char padding[58]; // заполняется 0 до конца заголовка
};
// структура заголовка файла BMP
structbmpHeaderType
{
char magic1, magic2; // типфайла (‘BM’)
long fileSize; // размер файла в б
long reserved; // зарезервировано постоянно 0
long pixelOffset; // смещениме данных от заголовка
long bmiSize; // размер заголовка
long cols, rows; // ширина и высота рисунки
int nPlanes; // число цветовых слоев (1)
int bitsPerPixel; // число битов на пиксел (1 — 2 цвета, 4 — 16 цветов, 8 — 256 цветов)
long compression, cmpSize; // сжатиекартинки?
long xScale, yScale; // горизонтальное и вертикальное разрешение
long colors, impColors; // число применяемых цветов
};
// установка графического режима 13h
void set_mode (void)
{
union REGS regs; // объявлено в dos.h — регистры
regs.h.ah = 0;
regs.h.al = VidMode;
int86 (0x10, ®s, ®s);
}
// установка текстового режимa
void set_text (void)
{
union REGS regs; // объявленов dos.h — регистры
regs.h.ah = 0;
regs.h.al = 0x03; // номер текстового режима
int86 (0x10, ®s, ®s);
}
void set_palette (int color, byte r, byte g, byte b) // устанавлениецветавпалитре
{
outportb (0x3C8, color);
outportb (0x3C9, r);
outportb (0x3C9, g);
outportb (0x3C9, b); }
// вывод пиксела установленного цвета в позицию x y
void put_pixel (int x, int y, byte color)
{
if (y>=0 && y<MaxY) // можно вывести эту точку
if (x>=0 && x<MaxX)
video[y*MaxX+x] = color; // внедрение прямого доступа к памяти
}
// Чтениезаголовка pcx файла
void read_pcx_header (FILE *dataFile, pcxHeaderType &pcxHeader)
{
fread (&pcxHeader, sizeof (pcxHeaderType), 1, dataFile);
}
// Вывод pcx файланаэкран
int show_pcx (char *name)
{
pcxHeaderType pcxHeader; // структуразаголовка
FILE *dataFile; // указательна pcx файл
byte color, r, g, b, // установка палитры
counter, length; // for RLE (счетчик, длина)
unsigned int x, y; // координатыпиксела
dataFile = fopen (name, «rb»); // открытиекартинки
if (dataFile == NULL) return 4; // ошибкаоткрытия
read_pcx_header (dataFile, pcxHeader); // тестированиенаошибки
if (pcxHeader.bitsPerPixel != 8) // не поддерживается (8 бит -256 цветов)
{ fclose (dataFile); return 1; }
else
cout << «Этот формат PCX не поддерживается» << endl;
if (pcxHeader.nColorPlanes != 1)// не поддерживается (число цветовых слоев — 1)
{ fclose (dataFile); return 2; }
else
cout << «Этот формат PCX не поддерживается» << endl;
if (pcxHeader.manufacturer != 10) // ошибка pcx (10 для Paintbrush)
{ fclose (dataFile); return 3; }
else
cout << «Ошибкав PCX» << endl;
fseek (dataFile, -768, SEEK_END); // начало чтения рисунки
set_mode(); // установка графического режима
for (x=0; x<256; x++) // чтение палитры
{
r = fgetc (dataFile); r = r>>2;
g = fgetc (dataFile); g = g>>2;
b = fgetc (dataFile); b = b>>2;
set_palette (x, r, g, b);
}
// начало вывода
x=0; y=0; // верхная левая координата
fseek (dataFile, 128, SEEK_SET); // перемещение указателя
while (y <= pcxHeader.height) // выводить пока не дойдет до крайней строчки
{
color = fgetc (dataFile); // чтение б
if (color < 192) // не сжатый?
{
if (x > pcxHeader.width) // проверка на переполнение
{
x = 0;
y++;
}
put_Pixel (x++, y, color); // вывод точки на экран
}
else // сжатый
{
length = color-192; // определение количества выводимых пикселов
color = fgetc (dataFile); // чтение последующего б
for (counter=0; counter<length; counter++)
{
if (x > pcxHeader.width) // проверка на переполнение
{
x = 0;
y++;
}
put_Pixel (x++, y, color); // вывод точки на экран
}
}
}
fclose (dataFile); // закрыть файл
getch(); // ожидать нажатие хоть какой клавиши
set_text(); // установка текстового режима
return 0; // возвратить код ошибки 0 (без ошибки)
}
// Чтениезаголовка bmp файла
void read_bmp_header (FILE *dataFile, bmpHeaderType &bmpHeader)
{
fread (&bmpHeader, sizeof (bmpHeaderType), 1, dataFile);
}
// Вывод bmp файланаэкран
int show_bmp (char *name)
{
bmpHeaderType bmpHeader; // структуразаголовка
FILE *dataFile; // указательнафайл
byte r, g, b; // красноватый, зеленоватый и голубий в гамме
int x, y; // координаты пиксела
unsignedintwidth; // ширина рисунки
dataFile = fopen (name, «rb»); // открытьфайл
if (dataFile == NULL) return 5; // еслинеможетоткрыть
read_bmp_header (dataFile, bmpHeader); // тестированиенаошибки
if (bmpHeader.nPlanes != 1) // не поддерживается (число цветовых слоев — 1)
{ fclose (dataFile); return 1; }
else
cout << «Этот формат BMP не поддерживается» << endl;
if (bmpHeader.bitsPerPixel != 8) // не поддерживается (8 бит -256 цветов)
{ fclose (dataFile); return 2; }
else
cout << «Этот формат BMP не поддерживается» << endl;
if (bmpHeader.compression != 0) // неподдерживается
{ fclose (dataFile); return 3; }
else
cout << «Этот формат BMP не поддерживается» << endl;
if (bmpHeader.magic1 != ‘B’ || bmpHeader.magic2 != ‘M’)
{fclose (dataFile); return 4;} // ошибка bmp
else
cout << «Это не формат BMP» << endl;
fseek (dataFile, 54, SEEK_SET); // начало чтения рисунки
set_mode(); // установка графического режима
for (x=0; x<256; x++) // чтение палитры
{
b = fgetc (dataFile); b = b>>2;
g = fgetc (dataFile); g = g>>2;
r = fgetc (dataFile); r = r>>2;
set_palette (x, r, g, b); // установка палитры
fgetc (dataFile); // последующий б
}
width = bmpHeader.cols; // чтение ширины из заголовка
while (width % 4 != 0) width++; // пока не кратно 4
for (y=bmpHeader.rows; y>0; y—) // до высоты рисунки
for (x=0; x<width; x++) // до ширины рисунки
put_Pixel (x, y, fgetc(dataFile)); // чтение и вывод
fclose (dataFile); // закрытие файла
getch(); // ожидать нажатия клавиши
set_text(); // возврат в текстовый режим
return 0; // возвратить код ошибки 0 (без ошибки)
}
//Читает имя файла из командной строчки, инспектирует по расширению к какому типу
//относится и вызывает подобающую функция просмотра
void main(int argc, char *argv[]) //количество характеристик и массив характеристик
{
char fodrive[MAXDRIVE], fodir[MAXDIR], foname[MAXFILE], foext[MAXEXT];
if (argc > 1) //если количество характеристик больше 1
{
fnsplit(argv[1],fodrive,fodir,foname,foext);
if (strcmp(strupr(foext),strupr(«.pcx»)) == 0) //сравнениепорасширению
show_pcx(argv[1]); //берем 2 параметр и выводим
if (strcmp(strupr(foext),strupr(«.bmp»)) == 0)
show_bmp(argv[1]); //берем 2 параметр и выводим
}
else
cout << «Пуск: PCX_BMP.EXE <имя файла>» << endl; // вывод на экран подсказки
}
]]>