FreeImage.lib库的配置和简单使用 转
转载地址 http://www.codeweblog.com/win8-1%E4%B8%8Bfreeimage-lib%E5%BA%93%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E7%AE%80%E5%8D%95%E4%BD%BF%E7%94%A8/
配置过OpenGL的同学,可以直接跳过这个部分,VS中配置FreeImage库和配置OpenGL库的流程完全相似。使用的是win7下的VS2013,可以按照下面步骤进行配置然后参考Demo使用该库。
- 首先把FreeImage.h 头文件在"VS安装目录"/VC/include/FreeImage/,FreeImage文件夹需要自己新建;
- 紧接着把FreeImage.lib静态库扔到"VS安装目录"/VC/lib/中;
- 最后,把FreeImage.dll动态链接库放在应用程序的目录下
- 到这里简单的配置过程就王完成了。
下面通过Demo来介绍一下FreeImage的一些基本用法,包括图片的加载,获取图片的像素数组,图片保存等。
int main(){
// 初始化
FreeImage_Initialise(TRUE);
// 文件名
const char* imageFile = "lenna.png";
const char* saveFile = "lenna_rotate.png";
// 图片格式
FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
// 获取图片格式
/* 此处需要特别注意,即使后缀名是.png并不代表图片格式就真是PNG格式,这里先通过FreeImage_GetFileType函数获取图片格式,
然后再进行加载,否则,也许会出现加载失败的情况。
*/
fif = FreeImage_GetFileType(imageFile);
if (fif == FIF_UNKNOWN)
fif = FreeImage_GetFIFFromFilename(imageFile);
FIBITMAP *bitmap1 = NULL;
FIBITMAP *bitmap2 = NULL;
if ((fif != FIF_UNKNOWN) && FreeImage_FIFSupportsReading(fif)){
bitmap1 = FreeImage_Load(fif, imageFile, PNG_DEFAULT);
}
if (!bitmap1){
fprintf(stderr, "Fail to Load Image!\n");
exit(-1);
}
else{
FreeImage_Save(fif, bitmap1, saveFile, PNG_DEFAULT);
bitmap2 = FreeImage_Load(fif, saveFile, PNG_DEFAULT);
if (!bitmap2){
fprintf(stderr, "Fail to Load saved Image!\n");
exit(-1);
}
}
// 获取影像的宽高,都以像素为单位
int width = FreeImage_GetWidth(bitmap1);
int height = FreeImage_GetHeight(bitmap1);
// 获取总共的像素数目
int pixel_num = width*height;
// 获取保存每个像素的字节数 这里为3,分别为RGB
unsigned int byte_per_pixel = FreeImage_GetLine(bitmap1) / width;
printf("Width:%d\t Height:%d\t 像素总数:%d\t 每像素字节数:%d\n", width, height, pixel_num, byte_per_pixel);
// 获取保存图片的字节数组
unsigned char *bits1 = FreeImage_GetBits(bitmap1);
unsigned char *bits2 = FreeImage_GetBits(bitmap2);
// 获取每个像素对应的RGB
unsigned char *reds = new unsigned char[pixel_num];
unsigned char *greens = new unsigned char[pixel_num];
unsigned char *blues = new unsigned char[pixel_num];
int cur = 0;
for (int x = 0; x < pixel_num; ++x){
// 这里对应于上述的每个像素的字节数:3
reds[x] = bits1[cur++];
greens[x] = bits1[cur++];
blues[x] = bits1[cur++];
}
// 反序更新saveFile的字节数组
cur = 0;
for (int x = pixel_num - 1; x >= 0; --x){
bits2[cur++] = reds[x];
bits2[cur++] = greens[x];
bits2[cur++] = blues[x];
}
// 保存更新后的图片
FreeImage_Save(fif, bitmap2, saveFile, PNG_DEFAULT);
// 从内存中删除载入图片,防止内存泄漏
FreeImage_Unload(bitmap1);
FreeImage_Unload(bitmap2);
// 撤销初始化
FreeImage_DeInitialise();
return 0;
}
上述代码运行后会在给定工程下的testFreeImage/下生成lenna_rotate.png图片,为原先图片旋转后的图片。
FreeImage.lib库的配置和简单使用 转的更多相关文章
- Win8.1下FreeImage.lib库的配置和简单使用(转)
转自http://www.codeweblog.com/win8-1下freeimage-lib库的配置和简单使用/ 首先,你可以从这里获取FreeImage的完整库文件(访问密码 9a5e). 配置 ...
- [转]VS2013+简单稀疏光束调整库SSBA配置(64位编译)
有关SSBA库的资源比较少,我是在Github上搜索下载的,具体的GitHub官方下载地址为:SSBA 下载后在SSBA解压文件夹下新建文件夹build. 打开cmake gui,在source co ...
- 在VS中添加lib库的三种方法
注意: 1.每种方法也要复制相应的DLL文件到相应目录,或者设定DLL目录的位置,具体方法为:"Properties" -> "Configuration Prop ...
- visual studio添加lib库
方法1: 通过设置工程配置来添加lib库. A.添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录. B.添加文件引用的lib静态库路径 ...
- android多lib库工程的自动批量构建--准备
打包这个活儿吧,本来没什么技术含量,千篇一律的更改渠道名称,然后编译,签名即可.但是如果发布渠道比较多的话,这种重复工作让人烦不胜烦.我们的应用发布渠道有30多个,若是手工打包,基本不用做其他的事情了 ...
- QT 编译遇到重定义;不同的基类型&在QT中使用C++ lib库
最近在使用osg和qt开发,在集成osg时候因为我使用的qt版本为非opengl的版本,导致qt自己封了一遍opengl的一些基类变量如double 这时候就会跟osg中声明的opengl的类型冲突, ...
- boost编译配置及简单使用
boost编译配置及简单使用 1.下载 http://www.boost.org/ 2.编译: A.解压 boost_1_55_0.zip 到boost路径 B.运行 bootstrap.bat. 会 ...
- lib库dll库的使用方法与关系
一.lib库 lib库有两种:一种是静态lib(static Lib),也就是最常见的lib库,在编译时直接将代码加入程序当中.静态lib中,一个lib文件实际上是任意个obj文件的集合,obj文件是 ...
- 如何把一个android工程作为另外一个android工程的lib库
http://zhidao.baidu.com/question/626166873330652844 一个工程包含另一个工程.相当于一个jar包的引用.但又不是jar包反而像个package 在网上 ...
随机推荐
- unity项目架构
Unity 游戏框架搭建 (一) 概述Unity 游戏框架搭建 (二) 单例的模板Unity 游戏框架搭建 (三) MonoBehaviour单例的模板Unity 游戏框架搭建 (四) 简易有限状态机 ...
- Coursera 机器学习 第5章 Neural Networks: Learning 学习笔记
5.1节 Cost Function神经网络的代价函数. 上图回顾神经网络中的一些概念: L 神经网络的总层数. sl 第l层的单元数量(不包括偏差单元). 2类分类问题:二元分类和多元分类. 上 ...
- Javascript 5种设计风格
1.过程式的程序设计 <script> /*Start and Stop animations using functions.*/ function startAnimation() { ...
- Bitmap图片查看器
在Android 应用中使用assets目录下存放的资源文件,assets目录下存放的资源代表应用无法直接访问的原生资源,应用程序通过AssetManager以二 进制流的形式来读取资源.此应用是查看 ...
- Android界面编程--使用活动条(ActionBar)--实现Tab导航
使用ActionBar结合fragment实现导航 1,调用ActionBar的setNavigationModel(ActionBar.NAVIGATION_MODE_TABS)设置使用tabs导航 ...
- 服务器LIUNX之如何解决矿机问题
点进来的基本都是遇到liunx变矿机的小伙伴吧(cpu运载300%) 卡的连终端都很难打开 开下来之后提示 大意是, 到xxx网站给钱了事, 不过基本这个网站基本也上不去, 要么是暴力破解, 要么是通 ...
- linux里终端安转视频播放器的操作及显示
[enilu@enilu ~]$ mplayerbash: mplayer: command not found[enilu@enilu ~]$ yum list | grep mplayer^C^C ...
- Centos6配置samba服务器并批量添加用户和文件夹
一.需求 局域网内有若干用户,所有用户访问一个共享目录 每个用户在共享目录里有自己的文件夹 每个用户都可以读取其他人的文件夹 每个用户只能对自己的文件夹有写入权限 所有用户都属于filesgroup组 ...
- JQuery Tips
另一篇文章 JavaScript Tips 1. 获取span标签的值需要用text(); 2. datepicker控件的‘setDate’属性可用于设置默认值: 3. 使用parseFloat转换 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(15)、要素绘制Drawtools3.0工具DEMO
1.前言 移动GIS项目开发中点线面的要素绘制及编辑是最常用的操作,在ArcGIS Runtime SDK for iOS 自带AGSSketchLayer类可以帮助用户快速实现要素的绘制,图形编辑. ...