Win8.1下FreeImage.lib库的配置和简单使用(转)
转自http://www.codeweblog.com/win8-1下freeimage-lib库的配置和简单使用/
首先,你可以从这里获取FreeImage的完整库文件(访问密码 9a5e)。
配置过OpenGL的同学,可以直接跳过这个部分,VS中配置FreeImage库和配置OpenGL库的流程完全相似。强调一点的是,虽然本人使用的是win8.1下的VS2013,但是个人觉得win7上下的操作系统或者VS2010以上的VS都可以按照这个步骤级逆行配置。可能有区别的是可能共享的Demo不能够直接运行,但是对于FreeImage的使用应该差不错。所以非win8.1和VS2013的也可以按照下面步骤进行配置然后参考Demo使用该库。
- 首先把FreeImage.h 头文件在"VS安装目录"/VC/include/FreeImage/,FreeImage文件夹需要自己新建;
- 紧接着把FreeImage.lib静态库扔到"VS安装目录"/VC/lib/中;
- 最后,把FreeImage.dll动态链接库放在C:\Windows\System32\下(这里C盘为系统盘)。64位的还需要将其放在C:\Windows\SysWOW64\下
- 到这里简单的配置过程就王完成了。
下面通过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图片,为原先图片旋转后的图片。


lenna.png lenna_rotate.png
更多关于FreImage的API可以参考下载的资料中的FreeImage中文教程.pdf 。
现在,你可以开始尝试在自己配置好的FreeImage开发环境下进一步学习怎么使用它的API实现你需要的功能。
Win8.1下FreeImage.lib库的配置和简单使用(转)的更多相关文章
- 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%9 ...
- pytorch下的lib库 源码阅读笔记(2)
2017年11月22日00:25:54 对lib下面的TH的大致结构基本上理解了,我阅读pytorch底层代码的目的是为了知道 python层面那个_C模块是个什么东西,底层完全黑箱的话对于理解pyt ...
- Centos7 下谷歌日志库GLog配置
1 glog下载地址 https://code.google.com/archive/p/google-glog/downloads glog-0.3.3.tar.gz 需要FQ,直接打不开 2 解压 ...
- pytorch下的lib库 源码阅读笔记(1)
置顶:将pytorch clone到本地,查看initial commit,已经是麻雀虽小五脏俱全了,非常适合作为学习模板. 2017年12月7日01:24:15 2017-10-25 17:51 参 ...
- 痞子衡嵌入式:MCUXpresso IDE下将源码制作成Lib库方法及其与IAR,MDK差异
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下将源码制作成Lib库方法及其与IAR,MDK差异. 程序函数库是一个包含已经编译好代码和数据的函数集合,这 ...
- ubuntu下安装opencv库+Python2.7环境安装及开发摄像头拍照应用
好久没有更新了,今天更一篇最近遇到的问题,及解决办法,后面博客得继续写起来 安装 #使用Python下的lib库直接进行安装 apt-get install python-opencv 测试 #使用如 ...
- linux下xdebug的安装和配置方法
xdebug简介 Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况. xdebug安装 首先让php错误显示,只需要修改php.in ...
- linux系统下tomcat应用开机自启动 配置
linux系统下tomcat应用开机自启动 配置 相对简单的方式是将tomcat添加为系统服务第一步 复制文件将 $Tomcat_Home/bin目录下的 catalina.sh脚本文件复制到目录/ ...
- VS2015下OpenGL库的配置
写在前面: 最近要用到OpenGL,光是在VS2015下配置就费了很大的劲,现在将我的成果直接贡献给大家,希望能为需要在VS2015下配置OpenGL的读者省去一些麻烦. 正文: 资源地址1:http ...
随机推荐
- cocos2dx中常见设计模式
1.单例设计模式:导演类 2.观察者模式: 被观察者含有一个数组,里边存放了所有观察者的引用,在被观察者的状态发生改变的时候,通过调用观察者的函数来通知观察者,实现了信息的传递. 事件监听器:就是采 ...
- thinkphp model模块
1.获取系统常量信息的方法:在控制器DengLuController里面下写入下面的方法,然后调用该方法. public function test() { //echo "这是测试的&qu ...
- Linux内核的总结认识
转载博文: http://www.linuxdiyf.com/linux/11234.html 1.内核是怎样实现其管理的职能? 以前在学校时一直不能理解内核是怎么做管理?比如内核如何知道在什么时候对 ...
- iOS 根据字符串内容动态计算行高
+ (CGFloat)textHeightFromTextString:(NSString *)text width:(CGFloat)textWidth fontSize:(CGFloat)size ...
- 使用HttpClient 发送get、post请求,及其解析xml返回数据
一.关于HttpClient的使用: 可以参考这个博客地址,这里有详细的介绍,需要的可以先看一下: 地址是:http://blog.csdn.net/wangpeng047/article/detai ...
- jQuery Mobile 工具栏
jQuery Mobile 工具栏 工具栏元素常被放置于页眉和页脚中 - 以实现"已访问"的导航: 标题栏 页眉通常会包含页眉标题/LOGO 或一到两个按钮(通常是首页.选项或搜索 ...
- 微信web开发者工具初探
最近需要在微信企业号中挂接网页,之前也没有接触过微信开发,刚开始也不知道怎么调试,后来同事介绍使用“微信web开发者工具”,于是在网上下了一个,使用了一下的确很好用.它不仅支持Android和IOS同 ...
- Java(类与对象)
1>对象判等 请输入并运行以下代码,得到什么结果? public class Test { public static void main(String[] args) { // TODO Au ...
- git资料图
- pynotify
import pynotify,sys if not pynotify.init('a'): sys.exit(1) n=pynotify.Notification('title','info','f ...