Руководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика
Скачать 0.66 Mb.
|
char** argv) { glutlnit (&argc , argv); glutlnitDisplayMode ( GLUT_SINGLE | GLUT_RGB | GLUT_DEFTH); glutlnitWindowSize (500, 500); glutCreateWindow (argv[0]); init (); glutReshapeFunc (reshape); glutDisplayFunc( display ) ; glutKeyboardFunc (keyboard); glutMainLoop () ; return 0; } Рис. Б.2. Результат работы программы Б.2. Б.З. Загрузка BMP файла В этом пункте приводится исходный текст функции LoadBMP(), которая позволяет загружать файлы полноцветных изображений (24 бита на точку) в формате Windows Bitmap (BMP). Синтаксис вызова функции: Б. 3. Загрузка BMP файла 179 int LoadBMP(const char* filename , IMAGE* out_img) Параметр filename определяет имя файла. Результат выполнения функции записывается в структуру out_img, которая определена следующим образом: typedef struct _MAGE { _ int width; int height; unsigned char* data; } IMAGE; Поля width и height хранят, соответственно, высоту и ширину изображения. В поле data построчно хранится само изображение, в виде последовательности RGB-компонент цветов пикселей. Программа Б.З. Загрузка BMP. Файл loadbmp.h. #ifndef JjOADBMP_H #define JjOADBMP_H typedef struct _MAGE { _ int width; int height; unsigned char* data; } IMAGE; int LoadBMP(const char* file , IMAGE* out_img); #endif Программа Б.4. Загрузка BMP. Файл loadbmp.cpp. ^include "loadbmp.h" ^include 180 Приложение Б. Демонстрационные программы ^include // размер заголовка BMP—файла #define BMP_SIZE_FILEHEADER 14 // размер информационного заголовка BMP—файла #define BMP_SIZEJNFOHEADER 40 #define BMP_COLOR_BITS_24 24 // вспомогательные функции static unsigned int uIntl6Number (unsigned char buf[2]) { return (buf[l] « 8) | buf[0]; } static unsigned int uInt32Number (unsigned char buf[4]) { unsigned numb = buf[3]; numb = (numb « 8) | buf[2]; numb = (numb « 8) | buf[l]; numb = (numb « 8) | buf[0]; return numb; } int ReadFileHeader (FILE* f, int* bitmap_pos) { unsigned char header [BMP_SIZE_FRJEHEADER] ; s i z e _ t numb = 0; int offset = 0; if (fseek(f, 0, SEEK_SET)) return 0; numb = fread (header , BMP_SIZE_FILEHEADER, 1, f); Б. 3. Загрузка BMP файла 181 if (numb ! = 1) return 0; if (header[0] != 'B' || header[l] != 'M') return 0; offset = uInt32Number (header + 10); numb = fread(header, 4, 1, f); if (numb ! = 1) return 0; if (uInt32Number(header) != 40) return 0; *bitmap_pos = offset ; return 1; } // загрузка BMP—файла int LoadBMP(const char* file , IMAGE* out_img) { FILE* f; int bitmap_pos; unsigned char buf[40]; s i z e _ t numb ; int x_res ; int y_res ; int n_bits ; int compression ; int size_image ; int n_used_colors ; // открываем файл f = fopen(file , "rb"); 182 Приложение Б. Демонстрационные программы if (!f) return 0; if (out_img = NULL) return 0; // читаем заголовок if (! ReadFileHeader (f , &bitmap_pos)) { fclose(f ); return 0; } if (fseek(f, BMP_SIZE_FILEHEADER, SEEK_SET)) { fclose(f ); return 0; } numb = fread(buf, 40, 1, f); if (numb ! = 1) { fclose(f ); return 0; } x_res = (int )uInt32Number (buf + 4); y_res = (int )uInt32Number (buf + 8); n_bits = (int) uIntl6Number ( buf + 14) compression = (int) uInt32Number ( buf + 16) size_image = ( |