opengl打开本地bmp图片绘制

Posted Arikes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opengl打开本地bmp图片绘制相关的知识,希望对你有一定的参考价值。

 

注意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图片绘制的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL-保存BMP图片

根据图片的url地址下载图片到本地保存代码片段

OpenGL中不用AUX库来加载BMP图片作为纹理

OpenGL没有将最近的片段绘制到相机

如何使用 OpenGL 保存 OpenGL 绘制?

OpenGL 片段着色器未写入 fbo 颜色缓冲区