АСТРАХАНСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

АСТРАХАНСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ

УНИВЕРСИТЕТ

РОСКОМРЫБОЛОВСТВА

Институт информационных технологий и коммуникаций

 

       Кафедра

Информационных

систем

КУРСОВАЯ РАБОТА

по дисциплине «Основы алгоритмического языка 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. В дальнейшем формат был преобразован в Windows Paintbrush и начал распространяться с Windows. Хотя область применения этого популярного формата сокращается, файлы формата PCX, которые легко узнать по расширению PCX, все еще широко распространены сегодня.

 



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

Описание и структура файла формата PCX.

Файлы PCX разделены на следующие три части: заголовок PCX, данные растрового массива и факультативная таблица цветов. 128-байт заголовок PCX содержит несколько полей, в том числе поля размера изображения и числа бит для кодирования информации о цвете каждого пиксела. Информация растрового массива сжимается с использованием простого метода сжатия RLE; факультативная таблица цветов в конце файла содержит 256 значений цветов RGB, определяющих цвета изображения. Формат PCX первоначально был разработан для адаптеров CGA- и EGA-дисплеев и в дальнейшем был модифицирован для использования в адаптерах VGA и адаптерах истинных цветов. Кодирование цвета каждого пиксела в современных изображениях PCX может производиться с глубиной 1, 4, 8 или 24 бит.

 

Описание программы.

После запуска программы PCX_BMP.EXE <имя графического файла> стандартная функция Fnsplit разбивает полное имя файла на 4 части. Что дает возможность передать файлы с расширениями PCX и BMP на обработку функциям вывода графических файлов на экран (show_pcx и show_bmp).

 

Используемые переменные и функции.

Глобальные переменные.

typedef unsigned char byte

Объявление типа.

 

char far *video = (char far *) 0xA0000000L

Указатель на видеопамять.

 

int MaxX, MaxY

Максимальное разрешение экрана.

 

VidMode=0x13

Гафический режим 13h.

 

Запуск программы

Программа является консольным приложением и функционирует под управлением операционной системы MS DOS или её эмуляции («Сеанс MS DOS» в Windows’е).

Запуск программы производится из окна файлового менеджера, либо из командной строки, и имеет следующий синтаксис:

 

PCX_BMP.EXE <имя графического файла>[PCX]/[BMP]

 

Примеры:

          PCX_BMP.EXE TEST.PCX

          PCX_BMP.EXE TEST.BMP

 

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

Содержание дистрибутивной дискеты

 

Дискета с дистрибутивом содержит следующие файлы:

 

В каталоге DEMO находится файл основной запускающей программы PCX_BMP.EXE.

 

В каталоге SOURCE находятся файл PCX_BMP.cpp - исходный текст программы, написанный на языке С++.

 

В каталоге DOC находится файл Viewer.doc - описание алгоритма и работы программы просмотра графических файлов.

 

В каталоге TEST находятся тестовые графические файлы.

 

TEST.BMP          – графический файл формата BMP (320x200)

TEST.PCX          – графический файл формата PCX (320x200)

TEST2.BMP        – графический файл формата BMP (224x160)

TEST2.PCX        – графический файл формата PCX (256x160)

TEST3.BMP        – графический файл формата BMP (320x22)

TEST3.PCX        – графический файл формата PCX (200x125)

 

В корневом каталоге дискеты находится файл Read.me.

 



СПИСОК ЛИТЕРАТУРЫ

 

1. Д.С. Ватолин "Алгоритмы сжатия изображений". Методические материалы к спецкурсу ВМиК МГУ "Машинная графика-2" под руководством Ю.М. Баяковского.

2. Справочное руководство по IBM PC. Часть 1. Москва ТПП “Сфера” 1991 стр. 55-62

3. http://home.novgorod.ru/lab/index.php3?path=formtfil/n-q

4. http://fileformat.virtualave.net/ind_form.htm

5. http://www.codenet.ru/progr/formt/intro.php

6. http://vnews.uka.ru/html/school.htm

7. http://www.halyava.ru/document/ext_b.htm

8. http://members.nbci.com/treestation/

9. http://graphics.cs.msu.su/

10. http://www.programmersheaven.com/zone10/index.htm

11. http://www.dcs.ed.ac.uk/home/mxr/gfx/utils-hi.html

12. http://rtfm.vn.ua/

13. http://www2.crosswinds.net/~hellerzone/manuals.html

14. http://www.math.rsu.ru/dictionary/fileform.htm

 

 



ПРИЛОЖЕНИЕ

Листинг программы “Просмотрщик графических файлов”.

#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

{

char manufacturer; // всегда 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

struct bmpHeaderType

{

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, &regs, &regs);

}

 

// Установка текстового режимa

void set_text (void)

{

union REGS regs;   // объявлено в dos.h - регистры

regs.h.ah = 0;

regs.h.al = 0x03;  // номер текстового режима

int86 (0x10, &regs, &regs);

}

 

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;                                       // координаты пиксела

unsigned int width;                    // ширина картинки

 

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; // вывод на экран подсказки

}

АСТРАХАНСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ

УНИВЕРСИТЕТ

РОСКОМРЫБОЛОВСТВА

Институт информационных технологий и коммуникаций

 

       Кафедра

Информационных

систем

КУРСОВАЯ РАБОТА

по дисциплине «Основы алгоритмического языка C++»

Дата: 2019-12-10, просмотров: 191.