/**** bmp图像简介即opengl示例 *****/
/*****************************************************************************************
功能
文件 opengl_3.h
编者:张永辉 2013年4月15日 整理
*****************************************************************************************/
#ifndef _OPENGL_3_H_
#define _OPENGL_3_H_
//函数声明
void OpenGl_3Test(void);
//****************************************************************************************
#endif
/*************************************bmp图像简介即opengl示例*****************************
1 BMP文件格式简单介绍
2 简单的OpenGL像素操作
3 glDrawPixels使用介绍
4 使用实例
编者:张永辉 2012年11月17日
参考:http://blog.csdn.net/pizi0475/article/details/5388119
------------------------------------------------------------------------------------------
1 BMP文件格式简单介绍
1 BMP可以保存单色位图、16色或256色索引模式像素图、24位真彩色图象,每种单一像素大小为1/8、1/2、1和3 字节。
2 BMP还定义了像素保存的方法:不压缩、RLE压缩等。
3 本例使用24位色、不使用压缩的BMP。
4 bmp在开始处有一个文件头,大小为54字节。保存了包括文件格式标识、颜色数、图象大小、压缩方式等信息。
5 在文件头中的地址分别为0x0012和0x0016,是宽度和高度,为一个32位整数
6 根据以上信息,可以读出一个24位的BMP图像了,代码见实例程序。
2 简单的OpenGL像素操作
OpenGL提供了简洁的函数来操作像素:
glReadPixels:读取一些像素。把已经绘制好的像素读取到内存”。
glDrawPixels:绘制一些像素。把内存中一些数据作为像素数据,进行绘制”。
glCopyPixels:复制一些像素。把已经绘制好的像素从一个位置复制到另一个位置
因为应用很简单,所以只介绍glDrawPixels了
3 glDrawPixels使用介绍。
glDrawPixels(ImageWidth, ImageHeight,GL_BGR_EXT,GL_UNSIGNED_BYTE,PixelData);
ImageWidth 宽度
ImageHeight 高度
GL_BGR_EXT 若 GL_RGB 像素是的红、绿、蓝三种数据,
GL_RGBA 像素是的红、绿、蓝、alpha四种数据,
GL_RED 像素仅红色数据
GL_COLOR_INDEX来读取像素的颜色索引
GL_UNSIGNED_BYTE表示读取的内容保存到内存时所使用的格式
GL_UNSIGNED_BYTE会把各种数据保存为GLubyte,
GL_FLOAT 会把各种数据保存为GLfloat
PixelData 显示数据的指针
4 使用实例
见本文
*****************************************************************************************/
/*****************************************************************************************
openGL显示BMP图像
文件 opengl_3.c
张永辉 2012年11月15
准备图像信息: \\embed\\vs2008\\dirvers\\1234.bmp 或者修改代码中的此路径
******************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <gl/glut.h>
static GLint ImageWidth; // 使用OpenGL的GLint类型,它是32位的。
static GLint ImageHeight;
static GLint PixelLength;
static GLubyte* PixelData;
#include "opengl_3.h" //#include "\embed\vs2008\drivers\opengl_3.h"
static void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);//可以不要清屏,因为每次绘制时,画面都覆盖整个屏幕
// 绘制像素
glDrawPixels(ImageWidth, ImageHeight,GL_BGR_EXT,GL_UNSIGNED_BYTE,PixelData);
// 完成绘制
glutSwapBuffers();
}
void OpenGl_3Test(void)
{
//打开文件
FILE File;
FILE *pFile;
pFile = &File;
fopen_s(&pFile,"\\embed\\vs2008\\dirvers\\1234.bmp", "rb");
if( pFile == 0 )
{
printf("BMP文件不存在\n");
getchar();
exit(0);
}
//读取图象的大小信息
fseek(pFile, 0x0012, SEEK_SET); //移动到0x0012位置
fread(&ImageWidth, sizeof(ImageWidth), 1, pFile);
fseek(pFile, 0x0016, SEEK_SET); //移动到0x0016位置.此句可以省略
fread(&ImageHeight, sizeof(ImageHeight), 1, pFile);
//计算像素数据长度
PixelLength = ImageWidth * 3; //每个像素3字节
while( PixelLength % 4 != 0 ) //修正LineLength使其为4的倍数
{
++PixelLength;//每一行像素数据的长度若不是4的倍数,则填充一些数据使它是4的倍数
}
PixelLength *= ImageHeight; //PixelLength = ImageWidth*3*ImageHeight;
//分配内存空间
PixelData = (GLubyte*)malloc(PixelLength);
if( PixelData == 0 )
{
exit(0);
}
fseek(pFile, 54, SEEK_SET); //
fread(PixelData, PixelLength, 1, pFile); //读取数据到 PixelData
//关闭文件
fclose(pFile);
//初始化GLUT并运行
//glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(ImageWidth, ImageHeight);
glutCreateWindow("读取24位BMP图像");
glutDisplayFunc(&display);
glutMainLoop();
free(PixelData);
return;
}