首页 > 其他 > 详细

opengl打开本地bmp图片绘制

时间:2016-04-05 00:14:34      阅读:357      评论:0      收藏:0      [点我收藏+]

 

注意bmp图片的格式问题,32位ARGB  或者24位RGB。你所采用的素材一定要注意是多少位的就用多少位的。否则会显示错误的图片或者其他什么的错误。

代码如下

32位版本

#include <GL/glut.h>

static GLint     ImageWidth;
static GLint     ImageHeight;
static GLint     PixelLength;
static GLubyte* PixelData;

#include <stdio.h>
#include <stdlib.h>

void display(void)
{
     // 清除屏幕并不必要
     // 每次绘制时,画面都覆盖整个屏幕
     // 因此无论是否清除屏幕,结果都一样
     // glClear(GL_COLOR_BUFFER_BIT);

     // 绘制像素
//    glBitmap(ImageWidth,ImageHeight,0,0,0.0,0.0,PixelData);
     glDrawPixels(ImageWidth, ImageHeight,
         GL_ABGR_EXT, GL_UNSIGNED_BYTE, PixelData);

     // 完成绘制
     glutSwapBuffers();
}

int main(int argc, char* argv[])
{
     // 打开文件
     FILE* pFile = fopen("/home/aerk/bbb.bmp", "rb");
     if( pFile == 0 )
         exit(0);

     // 读取图象的大小信息
     fseek(pFile, 0x0012, SEEK_SET);
     fread(&ImageWidth, sizeof(ImageWidth), 1, pFile);
     fread(&ImageHeight, sizeof(ImageHeight), 1, pFile);

     // 计算像素数据长度
     PixelLength = ImageWidth * 4;
     while( PixelLength % 4 != 0 )
         ++PixelLength;
     PixelLength *= ImageHeight;

     // 读取像素数据
     PixelData = (GLubyte*)malloc(PixelLength);
     if( PixelData == 0 )
         exit(0);

     fseek(pFile, 54, SEEK_SET);
     fread(PixelData, PixelLength, 1, pFile);

     // 关闭文件
     fclose(pFile);

     // 初始化GLUT并运行
     glutInit(&argc, argv);
     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
     glutInitWindowPosition(100, 100);
     glutInitWindowSize(ImageWidth, ImageHeight);
     glutCreateWindow("FileName");
     glutDisplayFunc(&display);
     glutMainLoop();

     // 释放内存
     // 实际上,glutMainLoop函数永远不会返回,这里也永远不会到达
     // 这里写释放内存只是出于一种个人习惯
     // 不用担心内存无法释放。在程序结束时操作系统会自动回收所有内存
     free(PixelData);

     return 0;
}

24位版本

#include <GL/glut.h>

static GLint     ImageWidth;
static GLint     ImageHeight;
static GLint     PixelLength;
static GLubyte* PixelData;

#include <stdio.h>
#include <stdlib.h>

void display(void)
{
     // 清除屏幕并不必要
     // 每次绘制时,画面都覆盖整个屏幕
     // 因此无论是否清除屏幕,结果都一样
     // glClear(GL_COLOR_BUFFER_BIT);

     // 绘制像素
//    glBitmap(ImageWidth,ImageHeight,0,0,0.0,0.0,PixelData);
     glDrawPixels(ImageWidth, ImageHeight,
         GL_BGR_EXT, GL_UNSIGNED_BYTE, PixelData);

     // 完成绘制
     glutSwapBuffers();
}

int main(int argc, char* argv[])
{
     // 打开文件
     FILE* pFile = fopen("/home/aerk/bbb.bmp", "rb");
     if( pFile == 0 )
         exit(0);

     // 读取图象的大小信息
     fseek(pFile, 0x0012, SEEK_SET);
     fread(&ImageWidth, sizeof(ImageWidth), 1, pFile);
     fread(&ImageHeight, sizeof(ImageHeight), 1, pFile);

     // 计算像素数据长度
     PixelLength = ImageWidth * 3;
     while( PixelLength % 4 != 0 )
         ++PixelLength;
     PixelLength *= ImageHeight;

     // 读取像素数据
     PixelData = (GLubyte*)malloc(PixelLength);
     if( PixelData == 0 )
         exit(0);

     fseek(pFile, 54, SEEK_SET);
     fread(PixelData, PixelLength, 1, pFile);

     // 关闭文件
     fclose(pFile);

     // 初始化GLUT并运行
     glutInit(&argc, argv);
     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
     glutInitWindowPosition(100, 100);
     glutInitWindowSize(ImageWidth, ImageHeight);
     glutCreateWindow("FileName");
     glutDisplayFunc(&display);
     glutMainLoop();

     // 释放内存
     // 实际上,glutMainLoop函数永远不会返回,这里也永远不会到达
     // 这里写释放内存只是出于一种个人习惯
     // 不用担心内存无法释放。在程序结束时操作系统会自动回收所有内存
     free(PixelData);

     return 0;
}

 

opengl打开本地bmp图片绘制

原文:http://www.cnblogs.com/L-Arikes/p/5353395.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!