Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МП 1,2.doc
Скачиваний:
9
Добавлен:
05.11.2018
Размер:
2.77 Mб
Скачать

4.4. Форматы хранения графических файлов

Существуют два принципиально отличающихся метода представления графических изображений: растровый и векторный. Растровое представление означает, что изображение было разбито сеткой. Световое значение (яркость, затемнение или цвет) каждой части (пиксела) сетки записывается индивидуально. Векторное представление определяет изображение в виде серии линий или фигур, возможно с некоторыми закрашенными областями, заполняемыми по специальным шаблонам. Текстовые процессоры, такие как Microsoft Word, часто способны включать как векторные изображения, например, файлы графопостроителя HPGL из программ CAD, так и двоичные изображения, например файлы TIFF из графических редакторов. Тем не менее, текстовые процессоры не обрабатывают изображения, а лишь привязывают их к документу.

Мы рассмотрим два формата, принадлежащие к различным методам представления изображений: PCX и PIC. Они могут быть обработаны текстовыми процессорами Microsoft Word, Word Perfect и др.

Формат PCX. Этот формат является наиболее широко используемым растровым форматом. Современные версии этого формата поддерживают полноцветные картинки (24-битовые цвета) и реализуются либо в качестве палитры, имеющей до 256 цветов, либо как полный 24-битовый RGB с размерами изображений до 64000x64000 пикселов. Изображение сжимается методом группового кодирования. Разработчиком новых версий файлов PCX является фирма Zsoft. Версии 0, 2, 3, 4, 5 соответствуют версиям приложения PC Paintbrush. Версия 4 соответствует PC Paintbrush для Windows, а версия 5 – PC Paintbrush IV Plus, PC Paintbrush Plus для Windows, Publisher’s Paintbrush.

Файл формата PCX содержит заголовок (128 байт) и данные. В некоторых версиях этого формата добавляется отдельная часть, посвященная палитре с количеством цветов до 256. Мы не будем рассматривать эти версии.

Заголовок определяется с помощью структуры:

struct PCXHEADER

{

char manuf; // информация о программе, создающей изображение;

// для Paintbruah равно 10

char hard; // версия, рассматривается 5

char encod; // 1 – групповое кодирование, 0 – без сжатия

char bitpx; // число битов на пиксел в каждой плоскости

int x1, y1, x2, y2; // координаты левого верхнего и правого нижнего

// углов, включительно

int hres; // горизонтальное разрешение = количество точек на

// дюйм по оси Х при распечатывании

int vres; // вертикальное разрешение = количество точек на

// дюйм по оси У при распечатывании (72)

char clrma[48]; // палитра для 16 цветов

char vmode; // резерв, всегда = 0

char nplanes; // количество битовых плоскостей (4)

int bplin; // число байт на одну строку в одной битовой плос-

// кости для распакованной строки, в Paintbrush

// выравнивается на границу слова

int palinfo; // 1 – цветная палитра, 2 – серая

int shres; // число пикселов экрана в

// горизонтальном направлении (640)

int svres; // высота экрана в пикселах (480)

char xtra[54]; // резерв

}

Алгоритм сжатия. Считываются строки, имеющие координаты у1 у у2. Каждой строке будет соответствовать строка бит, содержащая сначала биты плоскости 0, затем – плоскостей 1, 2, 3. На рис. 4.6 показано, каким образом формируется эта строка бит.

Число сохраняемых строк равно у2 - у1 + 1. Сохраняемая строка состоит из (int) (4* (х2 - х1 + 1) / 8) байт, если это число нечетно, то к этой строке добавляется один байт.

Байты считываются из сохраняемой строки бит и упаковываются следующим образом:

  • если байт повторяется, то записываются 2 байта – байт-повторитель и байт-значение (в котором содержится значение повторяемого байта), поскольку число повторений состоит из 6 бит, то оно не больше 63;

  • если байт один и если его значение < 11000000b, то записывается один байт, равный ;

  • если байт один и если его значение  11000000b, то записываются два байта, первый из которых равен 11000001b, а второй = 11000000b + значение.

Кодирование цвета в палитре. В массиве заголовка clrma[48] находится информация о палитре. Каждому регистру палитры отводится три байта. Например, регистру 0 отводятся байты clrma[0] = яркость красного, clrma[1] = яркость зеленого, clrma[48] = яркость синего. Регистру палитры i отводятся байты clrma[3*i], clrma[3*i+1], clrma[3*i+2].

Формат PIC. Приложение Lotus 1-2-3 генерирует файлы формата PIC для передачи его во вспомогательную программу Lotus печати графики. Файл формата PIC состоит из заголовка (17 байт) и графических команд, оперирующих с областью, состоящей из 32012312 точек. Левый нижний угол рисунка имеет координаты (0, 0), а правый верхний – (3200, 2311).

Заголовок состоит из следующих 17 байт:

1, 0, 0, 0, 1, 0, 8, 0, 0х44, 0, 0, 0, 0, 0х0С, 0х7F, 9, 6.

Каждая команда состоит из однобайтового кода операции, за которым при необходимости следуют аргументы. Значения координат Х и Y представляются как 16-битные целые числа. У этих значений старший байт расположен первым (соглашение Motorola), даже несмотря на то, что почти все программы, поддерживающие PIC, распространяются на машинах Intel. Обозначим через Хст и Xмл соответственно старший и младший байты Х.

Перечень команд (названия и коды):

  • Color p – установка цвета p,

код 0хВp (1 байт);

  • Move x, y - установка текущей позиции в (x, y),

код 0хА0, хст, хмл, уст, умл (5 байт);

  • Draw x, y – аналогично графической функции языка C++ lineto(x,y),

код 0хА2, хст, хмл, уст, умл (5 байт);

  • Fill N, x0, y0, …, xN, yN – заполненный многоугольник,

код 0х30, N, х0ст, х0мл, …, уNст, уNмл (4N+6 байт);

  • Fillo N, x0, y0, …, xN, yN – заполненный многоугольник с границей,

код 0хD0, N, х0ст, х0мл, …, уNст, уNмл (4N+6 байт);

  • Size x, y – установка размера последовательно выводящегося текста, координаты х и у задают размеры символа,

код 0хАС, хст, хмл, уст, умл (5 байт);

  • Font N – номер шрифта (N=0 или N=1),

код 0хА7, N (2 байта);

  • Text N, строка – вывод текста от текущей позиции, старшие 4 бита байта N определяют направление:

0 – горизонтально, слева направо,

1 – текст повернут на 90,

2 – текст повернут на 180,

3 – текст повернут на 270,

а младшие 4 бита байта N управляют выравниванием текстовой строки относительно текущей позиции; строка ограничена прямоугольником, и некоторая точка этого прямоугольника отождествляется с текущей позицией, согласно следующим значениям выравнивания:

0 – центр прямоугольника,

1 – центр левой стороны,

2 – центр правой стороны,

3 – центр нижней стороны,

4 – левый верхний угол,

5 – правый верхний угол,

6 – левый нижний угол,

7 – правый нижний угол,

код 0хА8, N, символ, символ,…,символ, 0 (последний символ строки равен 0);

  • End – конец рисунка,

код 0х06 (1 байт).

Примеры. Команда перемещения текущей позиции Move 1000, 2000 кодируется в виде:

0хА0, 3, 232, 7, 208,

поскольку старший байт числа 1000 равен 3, а младший – 232, а для 2000 они равны соответственно 7 и 208. Заполненный треугольник с вершинами (100, 100), (200, 200) и (100, 300) определяется с помощью команды

Fill 2, 100, 100, 200, 200, 100, 300

и кодируется с помощью 14 байт:

0х30, 2, 0, 100, 0, 100, 0, 200, 0, 200, 0, 100, 1, 44.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]