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

Автор работы: Пользователь скрыл имя, 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

Файлы: 1 файл

Просмотрщик.doc

— 135.50 Кб (Скачать файл)

        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 (без ошибки)

        }

     //Читает  имя файла из командной строки, проверяет по расширению к  какому типу

Информация о работе Просмотрщик графических файлов. Форматы PCX и BMP