注意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 == )
exit(); // 读取图象的大小信息
fseek(pFile, 0x0012, SEEK_SET);
fread(&ImageWidth, sizeof(ImageWidth), , pFile);
fread(&ImageHeight, sizeof(ImageHeight), , pFile); // 计算像素数据长度
PixelLength = ImageWidth * ;
while( PixelLength % != )
++PixelLength;
PixelLength *= ImageHeight; // 读取像素数据
PixelData = (GLubyte*)malloc(PixelLength);
if( PixelData == )
exit(); fseek(pFile, , SEEK_SET);
fread(PixelData, PixelLength, , pFile); // 关闭文件
fclose(pFile); // 初始化GLUT并运行
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(, );
glutInitWindowSize(ImageWidth, ImageHeight);
glutCreateWindow("FileName");
glutDisplayFunc(&display);
glutMainLoop(); // 释放内存
// 实际上,glutMainLoop函数永远不会返回,这里也永远不会到达
// 这里写释放内存只是出于一种个人习惯
// 不用担心内存无法释放。在程序结束时操作系统会自动回收所有内存
free(PixelData); return ;
}

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 == )
exit(); // 读取图象的大小信息
fseek(pFile, 0x0012, SEEK_SET);
fread(&ImageWidth, sizeof(ImageWidth), , pFile);
fread(&ImageHeight, sizeof(ImageHeight), , pFile); // 计算像素数据长度
PixelLength = ImageWidth * ;
while( PixelLength % != )
++PixelLength;
PixelLength *= ImageHeight; // 读取像素数据
PixelData = (GLubyte*)malloc(PixelLength);
if( PixelData == )
exit(); fseek(pFile, , SEEK_SET);
fread(PixelData, PixelLength, , pFile); // 关闭文件
fclose(pFile); // 初始化GLUT并运行
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(, );
glutInitWindowSize(ImageWidth, ImageHeight);
glutCreateWindow("FileName");
glutDisplayFunc(&display);
glutMainLoop(); // 释放内存
// 实际上,glutMainLoop函数永远不会返回,这里也永远不会到达
// 这里写释放内存只是出于一种个人习惯
// 不用担心内存无法释放。在程序结束时操作系统会自动回收所有内存
free(PixelData); return ;
}

opengl打开本地bmp图片绘制的更多相关文章

  1. perl打开本地/服务器图片

    index.html <html> <body> <h2> perl read img </h2> <img src = "displa ...

  2. MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

    版权声明:本文为博主原创文章,转载请注明CSDN博客源地址! 共同学习,一起进步~ https://blog.csdn.net/Eastmount/article/details/26404733   ...

  3. [转]opengl入门例题(读取bmp图片,并显示)

    #include<gl/glut.h> #define FileName "bliss.bmp" static GLint imagewidth; static GLi ...

  4. OPENGL 显示BMP图片+旋转

    VS2010/Windows 7/ 1. 需包含头文件 stdio.h, glaux.h, glut.h.需要对应的lib,并添加包含路径 2. 窗口显示用glut库的函数 3. bmp图片从本地读取 ...

  5. MFC对话框显示BMP图片

    1.MFC对话框显示BMP图片我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) ...

  6. BMP图片格式模型(2)

    因为公司的主要业务是图像识别相关的,因此对图像处理.识别是我学习的重点.虽然写程序也不少年了,但是对于图像处理领域,我还是一个新兵.对很多基础的概念也还是存在盲区,所以想在边学边做的过程中,对一些概念 ...

  7. OpenGL入门学习 课程 (三) 绘制几何图形的一些细节问题

    http://oulehui.blog.163.com/blog/static/79614698201191832753312/ 先回顾一下我们都学习了些什么: 第一课,编写第一个OpenGL程序第二 ...

  8. bmp图片的有关操作

    读取bmp图片 并生成新的bmp图片 #include "stdafx.h"#include <windows.h>#include <cmath>#inc ...

  9. Windows 保存BMP图片

    在Windows下保存BMP图片还是挺方便的,直接上代码,拷贝就能用 void savebmp(uchar * pdata, char * bmp_file, int width, int heigh ...

随机推荐

  1. 在iOS上自动检测内存泄露

    手机设备的内存是一个共享资源.应用程序可能会不当的耗尽内存.崩溃,或者遭遇大幅度的性能降低. Facebook iOS客户端有很多功能,并且它们共享同一块内存空间.如果任何特定的功能消耗过多的内存,就 ...

  2. BIEE Setup

    ORACLE 出品的产品绝对都可以称得上装X神器:安装文件一定要大(小水管不让你下个三天三夜那都不叫oracle),系统内存必须得大.硬盘空间必须足够多.安装时间必须足够长.各种配置必须足够复杂.学习 ...

  3. 关于MANIFEST.MF的理解

    打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录,这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息. 在Java平台中, M ...

  4. MATLAB LU函数

    高斯消元法求解线性方程,包括把增广矩阵转换为三角矩阵形式的过程,消去阶段工作 步骤是把矩阵A分解成为下三角L和上三角U的乘积.这种计算L,U的过程称为LU分解法. lu实现对矩阵的分解. [L,U] ...

  5. swift基本运算符

    一.空合运算符(Nil Coalescing Operator) 形式:a??b,如果a包含值则解封,否则返回默认值b 条件:a必须为optional类型,这个就不多说了,就是可选类型:默认值b的类型 ...

  6. MFC多视图共用一文档实现

    项目过程中有定制视图的需求,具体为打开程序默认双视图并且共用一个文档.在网上找了许多类似的资料,都不尽完善.本文直接从达到目的的角度叙述,实现原理不再多说. 1.在自己的App类中定义public变量 ...

  7. [转]Windows Shell 编程 第三章 【转自:http://blog.csdn.net/wangqiulin123456/article/details/7987901】

    第三章 操作文件 我依然清楚地记得,Windows95 的贝塔版出现的情形,它在朋友之间和学院中传播,好酷,全新的文件管理器,一种全图标,全彩色可客户化的界面,以及活泼的动画标识使得在文件拷贝和删除方 ...

  8. 文件上传~Uploadify上传控件

    对于文件上传来说,有很多种实现方式,如传统的表单方式,现在流行的flash方式,甚至还有纯JS方式,之所以有这些方式来实现文件上传,我想主要原因是因为,传统的上传对于大文件支持不够,因为它是单线程同步 ...

  9. 采用thinkphp框架实现添加管理员功能

    最近由于忙于期中和期末考试没有写新的随笔了,另外内心也在纠结要不要考研,直到昨天终于痛下决心,才突然间觉得豁然开朗. 由于做老师留的课程设计作业采用thinkPHP框架频繁,最近的几篇随笔将都从thi ...

  10. JS中undefined和null的区别

    在写JS脚本的时候,经常会碰到“为空”的判断,其中主要有null和undefined的判断.这两个为空判断的主要区别是: 1) null是JS的关键字,是语法特性.undefined是全局对象的属性, ...