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
  • 相关阅读:
    C++中整型变量的存储大小和范围
    A1038 Recover the Smallest Number (30 分)
    A1067 Sort with Swap(0, i) (25 分)
    A1037 Magic Coupon (25 分)
    A1033 To Fill or Not to Fill (25 分)
    A1070 Mooncake (25 分)
    js 获取控件
    C#代码对SQL数据库添加表或者视图
    JS 动态操作表格
    jQuery取得下拉框选择的文本与值
  • 原文地址:https://www.cnblogs.com/kmsfan/p/3966963.html
Copyright © 2011-2022 走看看