• 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;
    }
    生活的残酷,让我们习惯了忘记疲倦,一直奔向远方,追寻着自己的梦想。
  • 相关阅读:
    WordPress Export To Text插件‘download’参数远程文件包含漏洞
    WordPress EELV Newsletter插件跨站脚本漏洞
    WordPress Exploit Scanner插件安全绕过漏洞
    WordPress Feedweb插件跨站脚本漏洞
    WordPress User Role Editor插件跨站请求伪造漏洞
    Apache Struts ‘includeParams’安全绕过漏洞
    Linux Kernel ‘tcp_collapse()’ 本地拒绝服务漏洞
    Linux Kernel "iscsi_add_notunderstood_response()"缓冲区溢出漏洞
    开始读《Agile Web Development with Rails》
    开始使用2个显示器
  • 原文地址:https://www.cnblogs.com/L-Arikes/p/5353395.html
Copyright © 2020-2023  润新知