Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка простого графического редактора.doc
Скачиваний:
27
Добавлен:
28.06.2014
Размер:
137.73 Кб
Скачать

Московский энергетический институт

(технический университет)

Кафедра математического моделирования

Курсовая работа

По дисциплине: «Системное и прикладное ПО»

Тема: «Разработка простого графического редактора».

Выполнил: Батурурими Е.Л

Учебная группа: А-14-08

Принял: Князев А.В

МОСКВА

-2011-

Содержание:

  1. Текст задания................................................................................2

  2. Задача............................................................................................2

  3. Теория............................................................................................2

3.1 Графический формат .PCX

3.2 Программный код кодирования и

декодирования формата .PCX

  1. Функциональные тесты.............................................................9

  1. Текст программы.......................................................................10

1.Текст задания

Разработать простейший графический редактор, работающий в среде Windows. Должен быть обеспечен выбор цвета точек, стиля и цвета линий и цвета заливки, замкнутых фигур. В среде С++ Builder.

2.Задача.

Вид файла PCX.

Точки, линии,прямоугольники.

3.Теория.

3.1.Формат файла изображений (.Pcx)

Файлы изображений, (с расширениями .PCX) начинаются с заголовка длиной 128 байт.

Обычно можно игнорировать этот заголовок, если все изображения будут иметь одинаковое разрешение. Если же хотим обрабатывать изображения с различным разрешением и

разным количеством цветов, следует корректно интерпретировать информацию, находящуюся в данном заголовке.Оставшаяся часть файла с изображением состоит из закодированных графических данных. При кодировании используется простой алгоритм, основанный на методе длинных серий. Мы оставляем за собой право изменять этот алгоритм с

целью повышения эффективности упаковки данных. Если в файле запоминается несколько цветовых слоев, каждая строка изображения запоминается по цветовым слоям (в общем случае

красному-R, зеленому-G, синему-B и слою интенсивности-I) по схеме, приведенной ниже:

Строка изображения 0:

Строка изображения 0:

RRR...

GGG...

BBB...

III...

Строка изображения 1:

RRR...

GGG...

BBB...

III...

(и т.д.)

Замечание

Здесь в исходном документе имеет место явная некорректность. Запоминание по слоям проводится, как правило, для 16-цветных изображений EGA. В этом случае

сначала запоминается содержимое строки из нулевого слоя видео памяти, затем из первого и т.д. Нетрудно заметить, что даже при стандартной палитре EGA, которая устанавливается по

умолчанию BIOS'ом, нулевой слой видео памяти содержит СИНЮЮ компоненту цвета, а не красную. Если же палитра отлична от стандартной, то говорить о том, что слои видео памяти

соотносятся с компонентами цвета вообще затруднительно. Метод кодирования состоит в следующем:

ДЛЯ каждого байта X, прочитанного из файла

ЕСЛИ оба старших бита X равны 1, то

<повторитель> = 6 младшим битам X

<данные> = следующему байту за X

ИНАЧЕ

<повторитель> = 1

<данные> = X

Поскольку для насыщения данного алгоритма требуется в среднем 25% неповторяющихся данных и по меньшей мере наличие смещения между повторяющимися данными, то размер получаемого файла, как правило оказывается приемлемым. Формат заголовка файла приведен ниже.

Замечание

Под насыщением алгоритма авторы документа по всей видимости понимают ситуацию, когда размер получаемого файла оказывается больше, чем объем требуемой видео памяти для

представления записанного изображения. Нужно отметить, что с этой точки зрения формат PCX, безусловно, не лучший. В частности, такое насыщение достаточно часто имеет место для

цветных реалистичных изображений, особенно, если при их создании применялись методы полутонирования.

Формат заголовка PCX

Смещен. Обозначение Длина Описание/комментарий

0 Manufacturer 1 Постоянный флаг 10 = ZSoft .PCX

1 Version 1 Информация о версии:

0 = Версия 2.5

2 = Версия 2.8

с информацией о палитре

3 = Версия 2.8 без информации

о палитре

5 = Версия 3.0

2 Encoding 1 1 = .PCX кодирование длинными

сериями

3 Bits per pixel 1 Число бит на пиксел в слое

4 Window 8 Размеры изображения

(Xmin, Ymin) - (Xmax, Ymax)

в пикселах включительно

12 HRes 2 Горизонтальное разрешение

создающего устройства

14 VRes 2 Вертикальное разрешение

создающего устройства

16 Colormap 48 Набор цветовой палитры (см. далее

текст)

64 Reserved 1

65 NPlanes 1 Число цветовых слоев

66 Bytes per Line 2 Число байт на строку в цветовом

слое (для PCX-файлов всегда

должно быть четным)

68 Palette Info 2 Как интерпретировать палитру:

1 = цветная/черно-белая,

2 = градации серого

70 Filler 58 Заполняется нулями до конца

заголовка

Все переменные длины 2 являются целыми.

Замечание

Во избежание недоразумений: в поле Window последовательно располагаются 4 целых числа, которые соответствуют угловым координатам изображения Xmin, Ymin,

Xmax, Ymax. Как правило, Xmin и Ymin = 0.

Декодирование файлов в формате PCX

Сначала определите размер изображения, вычислив

[XSIZE = Xmax - Xmin + 1] и

[YSIZE = Ymax - Ymin + 1].

Затем вычислите, сколько байтов требуется для сохранения одной несжатой строки развертки изображения:

TotalBytes = NPlanes * BytesPerLine

Отметим, что поскольку всегда используется целое число байтов, возможно существование неиспользуемых данных в конце каждой строки развертки. TotalBytes показывает сколько

памяти должно быть доступно для декодирования каждой строки развертки, включая неиспользуемую информацию на правом конце каждой строки.

Теперь можно начать декодирование первой строки развертки - прочитав первый байт данных из файла. Если два старших бита этого байта равны 1, оставшиеся шесть битов

показывают сколько раз следует повторить СЛЕДУЮЩИЙ байт из файла. Если это не так, то этот байт сам является данными с повторителем равным 1. Продолжаем декодирование до конца

строки, ведя подсчет количества байтов, переданных в буфер вывода. В конце каждой строки развертки имеет место остановка алгоритма кодирования, но ее не существует при

переходе от одного слоя к другому. Когда строка сформирована полностью, в конце каждого слоя внутри строки возможно наличие лишних данных. Для нахождения этого остатка

используйте значения XSIZE и YSIZE. Если данные являются многослойными, то BytesPerLine показывает, где заканчивается каждый слой внутри строки развертки.

Продолжайте декодирование оставшихся строк. В файле возможно наличие лишних строк с округлением на 8 или 16 строк.

Замечание

Как следует из приведенного описания, в конце каждой строки развертки предусматривается остановка алгоритма кодирования, т.е предполагается, что каждая строка развертки

кодируется независимо. Однако опыт работы с файлами в формате PCX показывает, что это не всегда так. Конец каждой строки лучше все-таки фиксировать по заполнении ее буфера. Это,

безусловно, чуть усложнит программу декодирования, но сделает ее более гибкой

.

Описание информации о палитре

Информация о 16-цветной палитре (EGA/VGA)

Информация о палитре запоминается в одном из двух различных форматов. В стандартном формате RGB (IBM EGA, IBM VGA) данные запоминаются в 16 тройках. Каждая тройка состоит

из 3 байтов со значениями красного (Red), зеленого (Green) и синего (Blue) цветов. Значения могут находиться в диапазоне 0-255, и поэтому необходима их интерпретация в формат

используемого оборудования. Например, на IBM EGA существуют 4 возможных уровня RGB для каждого цвета. Поскольку 256/4 = 64, то ниже приведен список соответствия цветовых значений и

уровней:

Значение Уровень

0-63 0

64-127 1

128-192 2

193-254 3

Информация о 256-цветной палитре VGA

В настоящее время добавилась возможность хранения в файле изображения PCX палитры, превышающей 16 цветов. 256-цветная палитра форматируется и интерпретируется точно

также, как 16-цветная, естественно, за исключением того, что она длиннее. Палитра (число цветов x 3 байта длины) добавляется в конец PCX файла и ей предшествует байт с

десятичным значением 12. Для определения палитры VGA BIOS достаточно разделить прочитанные значения цветов на 4.

Для доступа к 256-цветной палитре следует:

1. Прочитать в заголовке поле Version. Если оно равно 5,

палитра должна быть.

2. Прочитать конец файла и отсчитать назад 769 байт.

Найденное вами значение должно равняться 12, что

указывает на присутствие 256-цветной палитры.

Замечание

Два замечания по поводу 256-цветной палитры. Во-первых, между пунктами 1 и 2 приведенной инструкции можно добавить следующий: "Прочитать в заголовке поле Bits per

pixel. Если оно равно 8, 256-цветная палитра должна быть." Смысл очевиден.

Во-вторых, в настоящее время довольно широкое распространение получил пакет программ .PCX Programmer's Toolkit фирмы Genus Microprogramming. В этом пакете принят способ хранения 256-цветной палитры несколько отличный от того, что был описан выше.

Отличие состоит в том, что палитре предшествует байт с десятичным значением 10 (вместо 12), а значения цветовых компонент занимают младшие 6 битов в каждом из байтов

цветовой тройки (т.е. изменяются от 0 до 63, как это принято в VGA BIOS).

Информация о цветовой палитре CGA

Для стандартной платы IBM CGA битовый набор для определения палитры более сложен. Используется только первый байт тройки. Первая тройка содержит только первый байт с

осмысленным значением, который определяет цвет фона. Чтобы определить цвет фона, нужно значение этого байта (беззнаковое) разделить на 16. В результате будет получено

значение в диапазоне 0-15, которое и определяет цвет фона. Вторая тройка содержит осмысленное значение первого байта,которое определяет значение палитры для трех оставшихся цветов.

Taблица цветов для CGA

Байт #16 в заголовке

Цвет фона определяется 4 старшими битами.

Байт #19 в заголовке

Используются только 3 старших бита, остальные 5

игнорируются. Первые три бита обозначаются как C, P, I.

Их интерпретация:

C: разрешение color burst - 0 = color; 1 = monochrome

P: палитра - 0 = желтая; 1 = белая

I: яркость - 0 = малая; 1 = повышенная.

Замечание

Как видно, исходный документ умалчивает о том, в каких

случаях информацию в заголовке файла следует трактовать как

палитру CGA. Не исключено, что ветвление следует вести по

полю Version заголовка.

Формат матричного шрифта

Матричный символьный шрифт запоминается в очень простом

формате. Формат этих символов следующий:

Заголовок (2 байта)

ширина шрифта db 0a0h + ширина символов (в точках)

высота шрифта db высота символов (в точках)

Ширина символов (256 байтов)

ширина символов db 256 dup(ширина каждого символа + 1)

Изображения символов

(остаток файла)

Символы запоминаются в порядке кодов ASCII и их может

быть до 256. Каждый символ выравнивается слева на границу

символьный блок и содержит одинаковое число байтов.

Байты организованы как N цепочек, где каждая цепочка

соответствует одной строке символа.

Например, каждый символ в шрифте размером 5x7 требует 7

байтов. Шрифт размера 9x14 использует 28 байтов на символ

(два байта на строку по 14 наборов). Допускается создание

шрифтов любого размера, при условии, что размер файла не

превышает 10K.