Автор работы: Пользователь скрыл имя, 28 Марта 2011 в 20:11, курсовая работа
Формат PCX стал первым стандартным форматом графических файлов для хранения файлов растровой графики в компьютерах IBM PC. Формат PCX изначально был придуман для хранения черно-белых графических файлов, создаваемых ранней версией программы раскраски PC Paintbrush. На этот формат в начале 80-х гг. фирмой Microsoft была приобретена лицензия, и затем он распространялся вместе с изделиями Microsoft.
ВВЕДЕНИЕ. 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
int hResolution, vResolution; // горизонтальное
и вертикальное разрешение
char egaPalette[48]; // палитра 256 цветов
char reserved; // зарезервировано всегда 0
char nColorPlanes; // число цветовых слоев
int bytesPerLine; // число байт на строку в цветном слое
int paletteType; // определение
палитры (1-цветная/черно-
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, ®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; // координаты пиксела
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 (без ошибки)
}
//Читает имя файла из командной строки, проверяет по расширению к какому типу
Информация о работе Просмотрщик графических файлов. Форматы PCX и BMP