zoukankan      html  css  js  c++  java
  • 如何使用SOIL在VS2012的 C++环境下显示图片

    先看下效果。

    这是一个很无聊的功能。。。。首先说下,我做这个功能的初衷并不是为了实现在控制台中显示图片。。。(这貌似很无聊)

    而是因为自己想做用C做一个游戏:http://q.cnblogs.com/q/65778/ 

    当然,这是一个艰难而且漫长的过程,我决定只参考下别人的代码而不完全搬运,顺便练下手,因为自己是JAVA程序员,学C貌似有点难度。

    我打算从画地图开始做起。

    扯远了,开始吧。

    SOIL(Simple OpenGL Image Library) 顾名思义,简单的OpenGL图片库

    其实载入图片的学习型过程中,我也学到了不少其他的东西,不过都是和图形有关的,比如gtk,opengl等。。。

    有经验都来分享下吧,首先是在visual studio环境下配置GTK。

    首先从这里下载GTK的完整版(Windows)。

    然后解压缩文件到你想要的位置,这里就把文件解压缩到D盘根目录下,为了以后方便,我们把文件夹名称改为gtk

    然后用管理员身份运行cmd,键入以下命令 setx GTKDIR D:gtk /m

    然后打开VS2012,新建一个C++项目,最好是空项目。

    然后右键单击你的项目,点击属性->配置属性->VC++目录

    找到右边的包含目录和库目录

    然后点击一下文本框,会出来一下下箭头,点一下,然后点击编辑

    然后点击新行,新建一行,然后在包含目录中分别把

    $(GTKDIR)libgtk-2.0include
    $(GTKDIR)libglib-2.0include
    $(GTKDIR)include
    添加进去,$(GTKDIR)就是刚才在CMD下添加的,当然你也可以省略掉上面的步骤,直接添加绝对路径,当然,这取决于你的喜好。
    在库目录中添加:
    $(GTKDIR)lib

    然后,选择链接器->系统->子系统->窗口 (/SUBSYSTEM:WINDOWS)
    注意,这个地方,以后如果如下报错。

    错误 1 error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 C:Userslidocumentsvisual studio 2012ProjectsWin32Project3Win32Project3MSVCRTD.lib(crtexew.obj) Win32Project3

    那么,就要把这里调回来哦~~~

    然后CMD,进入D:gtkin目录,

    我们下面要利用里面的命令做一些事情:

    首先是输入命令:

    pkg-config --cflags gtk+-2.0 --msvc-syntax > compilerflags.txt

    然后你就可以在D:gtk或者D:gtkin下面找到这个文件,里面写了如下内容:

    -mms-bitfields -ID:/gtk/include/gtk-2.0 -ID:/gtk/lib/gtk-2.0/include -ID:/gtk/include/atk-1.0 -ID:/gtk/include/cairo -ID:/gtk/include/gdk-pixbuf-2.0 -ID:/gtk/include/pango-1.0 -ID:/gtk/include/glib-2.0 -ID:/gtk/lib/glib-2.0/include -ID:/gtk/include -ID:/gtk/include/freetype2 -ID:/gtk/include/libpng14

    上面这段话,我们先暂时放这里。

    然后我们再输入:

    pkg-config --libs gtk+-2.0 --msvc-syntax > linkerflags.txt
    就会在目录下生产一个名为linkerflags.txt的文件
    里面内容如下:

    /libpath:D:/gtk/lib gtk-win32-2.0.lib gdk-win32-2.0.lib atk-1.0.lib gio-2.0.lib pangowin32-1.0.lib gdi32.lib pangocairo-1.0.lib gdk_pixbuf-2.0.lib pango-1.0.lib cairo.lib gobject-2.0.lib gmodule-2.0.lib gthread-2.0.lib glib-2.0.lib intl.lib

    然后我们右键点击项目,然后点击属性,单击C/C++下的命令行,下面有一栏空白的其他选项,把第一段绿色的文字(compilerflags.txt)复制到里面去,

    然后跳到链接器->命令行,把第二段绿色的文字(linkerflags.txt)里的内容复制进去。

    到此为止,你就可以在include里引用gtk了!

    到此为止,大功告成,如果大家以后看到了其他的插件,想引用进来,也可以用类似的方法,大部分情况下都会成功的哦~~

    SOIL下载地址

    下面来介绍一下SOIL的引入方法,重复的地方就不说了,有一点不同我还是要说下,

    如果直接按照上面的方法,会引入成功,但是调试运行程序的时候会报错,这怎么解决呢?

    在SOIL目录下->projects下面有以下文件。

    都是工程文件哦

    这里我们选择VC8来做吧,我在VS2012下面用VC8的成功了,VC9的失败了,不懂为什么。

    回到原来的项目,右键单击解决方案添加现有项目,定位到哪个VC8的地方,然后添加进去。

    然后再进行引用就OK了。

    然后你就可以编译成功了(网上说了一些其他的方法,我试了没用,目前只知道引用工程的方法)。

    好了,然后我放代码出来吧:

    //#include "graphics.h"
    #include <stdio.h>
    
    #include <windows.h>
    #include <conio.h>
    #include <math.h>
    #include <GLglut.h>
    #include <GLGL.h>
    #include <GLGLU.h>
    #include <SOIL.h> //轻量级图形控件
    
    
    
    
    //载入图片
    GLuint    myTexture;
    
    void display(void)
    {
        glClear(GL_COLOR_BUFFER_BIT);
        
        glLoadIdentity();
        glTranslatef(100.0f, 100.0f, 0.0f);
        
        glBindTexture(GL_TEXTURE_2D, myTexture);
        glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f);
        glVertex2f(0.0f, 0.0f);
        glTexCoord2f(1.0f, 0.0f);
        glVertex2f(256.0f, 0.0f);
        glTexCoord2f(1.0f, 1.0f);
        glVertex2f(256.0f, 256.0f);
        glTexCoord2f(0.0f, 1.0f);
        glVertex2f(0.0f, 256.0f);
        glEnd();
        
        glutSwapBuffers();
    }
    
    void reshape(int width, int height)
    {
        glViewport(0, 0, width, height);
        
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0, width, 0, height);
        glMatrixMode(GL_MODELVIEW);
    }
    
    void idle(void)
    {
        glutPostRedisplay();
    }
    
    int main(int argc, char** argv)
    {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
        glutInitWindowSize(640, 480);
        glutCreateWindow("SOIL test");
        glutDisplayFunc(display);
        glutReshapeFunc(reshape);
        glutIdleFunc(idle);
        
        myTexture = SOIL_load_OGL_texture("1.jpg", 0, 1, SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_INVERT_Y);
        if (!myTexture)
        {
            printf("soil failed to load texture
    ");
            //exit(0);
        }
        glEnable(GL_TEXTURE_2D);
        
        glutMainLoop();
        return EXIT_SUCCESS;
    }
    

      其实我也是初学呢,所以代码解释方面的话,我也不敢乱说话。

    还有一点打击要注意下,就是载入图片的路径,我这里是1.jpg,这个1.jpg是相对路径,

    如果路径错误,是载入不了图片的,设置路径方式如下:

    右键单击项目,在配置属性下的调试里面有一个工作目录,工作目录就是相对路径哦。

    我自己因为是出于练手阶段,所以删除了一些没必要的代码,其实开始写了一些画正方形和线段的代码,这里没放出来,以后不过会放的。

    编辑:

    今天把代码做了一下分析,想看的点开吧,都写了注释。

    //#include "graphics.h"
    #include <stdio.h>
    
    #include <windows.h>
    #include <conio.h>
    #include <math.h>
    #include <GLglut.h>
    #include <GLGL.h>
    #include <GLGLU.h>
    #include <SOIL.h> //轻量级图形控件
    
    
    
    
    //载入图片
    GLuint    myTexture;
    
    void display(void)
    {
        glClear(GL_COLOR_BUFFER_BIT);
        
        glLoadIdentity();
    
        //详情:http://msdn.microsoft.com/en-us/library/windows/desktop/ee872066(v=vs.85).aspx
        //第一个参数:图片在X轴方向的位置,越大图片越往右边偏移,Y同样的,是从屏幕的左下角开始计算的。
        glTranslatef(0.0f, 0.0f, 0.0f);
        
        glBindTexture(GL_TEXTURE_2D, myTexture);
        glBegin(GL_QUADS); //开始画线
    
        /*注意glTexCoord2f的值只能是-1~1的浮点型数字
        注意glVertex2f的第一个参数为X轴的左边,第二个参数为Y轴的坐标
        需要4个坐标进行配合,这样才能做出不同大小的图片*/
        //左下角
        glTexCoord2f(0.0f, 0.0f);
        glVertex2f(0.0f, 0.0f);
    
        //右下角
        glTexCoord2f(1.0f, 0.0f);
        glVertex2f(805.0f, 0.0f);
    
        //右上角顶点
        glTexCoord2f(1.0f, 1.0f);
        glVertex2f(805.0f, 150.0f);
    
        //左上角
        glTexCoord2f(0.0f, 1.0f);
        glVertex2f(0.0f, 150.0f);
    
    
        //结束画线
        glEnd();
        
        //如果没有这一步,窗口将会变成白色,原因不明
        glutSwapBuffers();
    }
    
    void reshape(int width, int height)
    {
        glViewport(0, 0, width, height); //这里的width和height是glutInitWindowSize时设置的,下同。
        
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0, width, 0, height);
        glMatrixMode(GL_MODELVIEW);
    }
    
    void idle(void)
    {
        glutPostRedisplay();
    }
    
    int main(int argc, char** argv)
    {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
        glutInitWindowSize(800, 600);
        glutCreateWindow("SOIL test");
        glutDisplayFunc(display);
        glutReshapeFunc(reshape);
        glutIdleFunc(idle);
        
        myTexture = SOIL_load_OGL_texture("1.jpg", 0, 1, SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_INVERT_Y);
        if (!myTexture)
        {
            printf("soil failed to load texture
    ");
            //exit(0);
        }
        //启用gl
        glEnable(GL_TEXTURE_2D);
        
        glutMainLoop();
        return EXIT_SUCCESS;
    }
    View Code
  • 相关阅读:
    Thinkphp注释
    THINKPHP5 如何在 控制器内调用model模型
    thinkphp5路由定义
    Thinkphp5读取当前config配置文件
    thinkphp5计算代码块的性能
    thinkphp的执行流程
    php filter过滤器
    nginx在收到stop信号后的处理
    寻找重复数
    奶牛和公牛
  • 原文地址:https://www.cnblogs.com/kmsfan/p/3966963.html
Copyright © 2011-2022 走看看