如何使用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++目录
找到右边的包含目录和库目录
然后点击一下文本框,会出来一下下箭头,点一下,然后点击编辑
然后点击新行,新建一行,然后在包含目录中分别把
错误 1 error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 C:\Users\li\documents\visual studio 2012\Projects\Win32Project3\Win32Project3\MSVCRTD.lib(crtexew.obj) Win32Project3
那么,就要把这里调回来哦~~~
然后CMD,进入D:\gtk\bin目录,
我们下面要利用里面的命令做一些事情:
首先是输入命令:
-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
上面这段话,我们先暂时放这里。
然后我们再输入:
/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目录下->projects下面有以下文件。
都是工程文件哦
这里我们选择VC8来做吧,我在VS2012下面用VC8的成功了,VC9的失败了,不懂为什么。
回到原来的项目,右键单击解决方案添加现有项目,定位到哪个VC8的地方,然后添加进去。
然后再进行引用就OK了。
然后你就可以编译成功了(网上说了一些其他的方法,我试了没用,目前只知道引用工程的方法)。
好了,然后我放代码出来吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | //#include "graphics.h" #include <stdio.h> #include <windows.h> #include <conio.h> #include <math.h> #include <GL\glut.h> #include <GL\GL.h> #include <GL\GLU.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\n" ); //exit(0); } glEnable(GL_TEXTURE_2D); glutMainLoop(); return EXIT_SUCCESS; } |
其实我也是初学呢,所以代码解释方面的话,我也不敢乱说话。
还有一点打击要注意下,就是载入图片的路径,我这里是1.jpg,这个1.jpg是相对路径,
如果路径错误,是载入不了图片的,设置路径方式如下:
右键单击项目,在配置属性下的调试里面有一个工作目录,工作目录就是相对路径哦。
我自己因为是出于练手阶段,所以删除了一些没必要的代码,其实开始写了一些画正方形和线段的代码,这里没放出来,以后不过会放的。
编辑:
今天把代码做了一下分析,想看的点开吧,都写了注释。

__EOF__
作 者:ღKawaii
出 处:https://www.cnblogs.com/kmsfan/p/3966963.html
关于博主:一个普通的小码农,为了梦想奋斗
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本。
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!

出处:http://www.cnblogs.com/kmsfan
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
欢迎大家加入KMSFan之家,以及访问我的优酷空间!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?