Приложение
Вывод иллюстраций
В библиотеке graph нет функции, обеспечивающей вывод на экран иллюстрации, находящейся в файле. Программист должен сам разработать такую функцию. Однако эта задача является довольно сложной. Ниже приведен текст разработанной автором функции draw, которая выводит на экран 16-цветную картинку – содержимое bmp-файла. Картинка должна быть создана в среде Microsoft Windows, например, при помощи графического редактора Paint.
#include <stdio.h> #include <graphics.h>
Функция draw выводит на экран шестнадцатицветную картинку, находящуюся в bmp-файле:
int draw(int x0, int y0, char* fname);
- х0,у0 – координаты левого верхнего угла области вывода
- fname – имя файла картинки;
Значения функции:
- >0 – высота иллюстрации;
- -1 – не найден файл;
- -2 – картинка не является шестнадцатицветной.
// таблица преобразования кодировки // цвета Windows › DOS unsigned char color[16] = {0.4.2.6.1.5.3.7, 8.12.10.14.9.13.11.15}; // прочитав из bmp-файла эту структуру, // можно получить информацию о картинке: //ее размере и количестве цветов struct bmpinfo { char hl,h2; // файл должен начинаться буквами ВМ unsigned long size, // размер файла, байт reserved, // резерв, не используется offset, // смещение данных относительно // начала файла b, // не используется width, // ширина картинки height; // высота картинки unsigned int plans, // кол-во планов, должно содержать 1 bрр; // кол-во бит на пиксел: 1, 4, 8 или 24 bmpinfo info; FILE *?; // информация о картинке // файл иллюстрации int x,y; // координаты пиксела unsigned char b; // байт, прочитанный из файла unsigned char bh; // сдвинутый на 4 разряда вправо // старший полубайт unsigned char bl; // четыре младшие бита // прочитанного байта int nb; // кол-во байт (кратное четырем) // соответствующее строке int np; // кол-во выведенных пикселов int i,j; if ((f = fopenffname, "rb")) == NULL) return -1; // читаем информацию о картинке fread(Sinfo, sizeof(info),1, f); if (info.bpp!= 4) return -2; // картинка не 16-цветная x = x0; у = y0 + info.height; nb = (info.width / 8)*4; if ((info.width /8)!= 0) nb += 4; fseek(f, info.offset, SEEK_SET); // вывод иллюстрации for (i = 0; i < info.height; i++) np =0; // кол-во выведенных пикселов for (j = 0; j < nb; j++) // вывод строки { b = fgetc(f); if (np < info.width) { bh = b >> 4; putpixel(x,y,color[bh]); np++; } if (np < info.width) bh = b & 15; putpixel(x,y,color[bl]); np++; x=x0; y-; fclose(f); return info.height;