注意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; }
时间: 2024-10-06 12:45:56