opengl打开本地bmp图片绘制

时间:2023-03-08 17:36:40

注意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 ;
}