先看下效果。

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

而是因为自己想做用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)\lib\gtk-2.0\include
$(GTKDIR)\lib\glib-2.0\include
$(GTKDIR)\include

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

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

错误 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目录,

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

首先是输入命令:

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

然后你就可以在D:\gtk或者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

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

然后我们再输入:

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 <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是相对路径,

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

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

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

编辑:

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

//#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(); //详情: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(, , width, height); //这里的width和height是glutInitWindowSize时设置的,下同。 glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(, width, , height);
glMatrixMode(GL_MODELVIEW);
} void idle(void)
{
glutPostRedisplay();
} int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowSize(, );
glutCreateWindow("SOIL test");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutIdleFunc(idle); myTexture = SOIL_load_OGL_texture("1.jpg", , , SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_INVERT_Y);
if (!myTexture)
{
printf("soil failed to load texture\n");
//exit(0);
}
//启用gl
glEnable(GL_TEXTURE_2D); glutMainLoop();
return EXIT_SUCCESS;
}

如何使用SOIL在VS2012的 C++环境下显示图片的更多相关文章

  1. 在laravel环境下将图片存入MongoDB数据库

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  2. 本地ubuntu下pycharm 如何利用远程开发环境时显示图片

    最近使用pycharm远程开发tensorflow,每次在想显示图像时,苦于不知怎么操作,就通过保存后再看结果,使得调试很不方便.今天打算解决这个问题,收获也是很多啊. 我首先参考了这两篇博客: ht ...

  3. win32环境下显示中文

    //编码转换 //#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) // string title = "成绩"; // GBK2UTF8 ...

  4. win10 环境 gitbash 显示中文乱码问题处理

    gitbash 是 windows 环境下非常好用的命令行终端,可以模拟一下linux下的命令如ls / mkdir 等等,如果使用过程中遇到中文显示不完整或乱码的情况,多半是因为编码问题导致的,修改 ...

  5. 【Tesseract-OCR】在VS2012环境下调用API方法---注意避免名字冲突

    由于在VS2012中使用OpenCV可以得到插件ImageWatch.vsix的支持,查看图像非常方便,所以一直想在VS2012环境下把Tesseract-OCR融合进来,但是这一错误折腾了我好久: ...

  6. libCURL开源库在VS2010环境下编译安装,配置详解

    libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...

  7. cocos基础教程(2)Window环境下搭建

    第一步:开始安装VS2012  第二步:下载Cocos2d-x 3.4源码  配置环境变量 COCOS_CONTROL = E:\cocos2d-x-3.4\tools\cocos2d-console ...

  8. windows环境下搭建ffmpeg开发环境

           ffmpeg是一个开源.跨平台的程序库,能够使用在windows.linux等平台下,本文将简单解说windows环境下ffmpeg开发环境搭建过程,本人使用的操作系统为windows ...

  9. 最新 Cocos2d-x 3.2 开发环境搭建(windows环境下)

    本篇是基于Cocos2d-x-3.2和vs2012的环境下配置. 1.先从官方站点(www.cocos2d-x.org)下载 Cocos2d-x-3.2文件. 2.因为Cocos2d-x 3.0以上的 ...

随机推荐

  1. pagination 分页

    <!DOCTYPE html> <html> <head> <title>pagination</title> <style type ...

  2. 解读2015年互联网UGC内容发展态势,安全事件频发

    <2015内容安全年报> 阿里移动安全 第一章 2015年内容安全形势 随着互联网业务的迅速发展,互联网上的信息内容带来了爆炸式的增长.由于缺乏对网络活动进行有效监督和管理的措施,致使互联 ...

  3. python自动化测试(3)- 自动化框架及工具

    python自动化测试(3) 自动化框架及工具 1   概述 手续的关于测试的方法论,都是建立在之前的文章里面提到的观点: 功能测试不建议做自动化 接口测试性价比最高 接口测试可以做自动化 后面所谈到 ...

  4. 【转】我的技术学习方法 — Anytao

    原文作者:anytao—王涛 他的著作:<你必须知道的.Net> 关于这个问题,也有不少刚刚入行的朋友向我问起.我想可能一千个人就有一千个答案,我不能保证自己的想法适合于所有的人,但是这确 ...

  5. [.net 面向对象程序设计深入](5)MVC 6 —— 构建跨平台.NET开发环境(Windows/Mac OS X/Linux)

    [.net 面向对象程序设计深入](5)MVC 6 —— 构建跨平台.NET开发环境(Windows/Mac OS X/Linux) 1.关于跨平台 上篇中介绍了MVC的发展历程,说到ASP.NET ...

  6. adb server is out of date. killing...

    1.查看adb端口号 adb nodaemon server 打印:cannot bind 'tcp:5037' 2.查看端口被哪个进程占用 netstat -ano | findstr " ...

  7. ASP.NET Web API路由系统:Web Host下的URL路由

    ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...

  8. 前nginx后Apache+Node反向代理

    前几天一直在被一个问题困扰,机器上跑的站点太多了,Apache上面有十几个,NodeJS的也有一堆,记端口号都要烦死,于是萌生了使用反向代理的想法.出发点貌似太low了,完全不是出于负载均衡.高并发什 ...

  9. [SDK2.2]Windows Azure Storage (16) 使用WCF服务,将本地图片上传至Azure Storage (上) 客户端代码

    <Windows Azure Platform 系列文章目录> 前一章我们完成了服务器端的代码,并且已经发布到了Windows Azure云端. 本章我们将实现客户端的代码,客户端这里我们 ...

  10. WCF 的 Service Instance模式和并发处理

    WCF 的 Service Instance(实例)有三种模式 PerCall:每一次调用都创建一个实例,每一次调用结束后回收实例.此模式完全无状态. PerSession:调用者打开Channel时 ...