Иллюстрированный самоучитель по С++ для начинающих

Приложение

Вывод иллюстраций

В библиотеке 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;
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.