现在的位置: 首页 > 综合 > 正文

vs2008\drivers\opengl_3.h.c_opengl显示24位BMP图像简介+示例

2013年11月27日 ⁄ 综合 ⁄ 共 3857字 ⁄ 字号 评论关闭

/**** 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;
}

 

抱歉!评论已关闭.