转载地址 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库的配置和简单使用 转的更多相关文章

  1. Win8.1下FreeImage.lib库的配置和简单使用(转)

    转自http://www.codeweblog.com/win8-1下freeimage-lib库的配置和简单使用/ 首先,你可以从这里获取FreeImage的完整库文件(访问密码 9a5e). 配置 ...

  2. [转]VS2013+简单稀疏光束调整库SSBA配置(64位编译)

    有关SSBA库的资源比较少,我是在Github上搜索下载的,具体的GitHub官方下载地址为:SSBA 下载后在SSBA解压文件夹下新建文件夹build. 打开cmake gui,在source co ...

  3. 在VS中添加lib库的三种方法

    注意: 1.每种方法也要复制相应的DLL文件到相应目录,或者设定DLL目录的位置,具体方法为:"Properties" -> "Configuration Prop ...

  4. visual studio添加lib库

    方法1: 通过设置工程配置来添加lib库. A.添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录. B.添加文件引用的lib静态库路径 ...

  5. android多lib库工程的自动批量构建--准备

    打包这个活儿吧,本来没什么技术含量,千篇一律的更改渠道名称,然后编译,签名即可.但是如果发布渠道比较多的话,这种重复工作让人烦不胜烦.我们的应用发布渠道有30多个,若是手工打包,基本不用做其他的事情了 ...

  6. QT 编译遇到重定义;不同的基类型&在QT中使用C++ lib库

    最近在使用osg和qt开发,在集成osg时候因为我使用的qt版本为非opengl的版本,导致qt自己封了一遍opengl的一些基类变量如double 这时候就会跟osg中声明的opengl的类型冲突, ...

  7. boost编译配置及简单使用

    boost编译配置及简单使用 1.下载 http://www.boost.org/ 2.编译: A.解压 boost_1_55_0.zip 到boost路径 B.运行 bootstrap.bat. 会 ...

  8. lib库dll库的使用方法与关系

    一.lib库 lib库有两种:一种是静态lib(static Lib),也就是最常见的lib库,在编译时直接将代码加入程序当中.静态lib中,一个lib文件实际上是任意个obj文件的集合,obj文件是 ...

  9. 如何把一个android工程作为另外一个android工程的lib库

    http://zhidao.baidu.com/question/626166873330652844 一个工程包含另一个工程.相当于一个jar包的引用.但又不是jar包反而像个package 在网上 ...

随机推荐

  1. IDEA 导入cordova3.5工程目录注意事项

    IDEA 导入cordova3.5工程目录注意事项 1 eclipse很不稳定,有很多小问题.平时我自己用idea,但是当用cordova3.5创建好工程目录是,用eclipse导入时没有问题的.但是 ...

  2. JQuery脚本-通过禁用按钮防止表单重复提交

    <script type="text/javascript"> /* jquer 脚本,避免重复提交 隐藏点击的submit,后在他之后插入同名button伪装成被隐藏 ...

  3. BNU29140——Taiko taiko——————【概率题、规律题】

    Taiko taiko Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class ...

  4. C++程序设计基础(3)条件语句和循环语句

    注:读<程序员面试笔记>笔记总结 1.知识点 1.1条件语句 (1)if……:(2)if……else……:(3)if……else if……:(4)switch(){case ():brea ...

  5. 从零实现一个简易jQuery框架之一—jQuery框架概述

    我们知道,不管学习任何一门框架,了解其设计的理念.目的.总体的结构及核心特性对我们使用和后续的深入理解框架都是有很大的帮助的.因此在这里先梳理一下本人对jQuery框架的一些理解. 设计目的(为什么要 ...

  6. 【Ubuntu】ubuntu 16.04 设置root用户初始密码

    安装ubuntu成功后,都是普通用户权限,并没有最高root权限,如果需要使用root权限的时候,通常都会在命令前面加上 sudo . 我们一般使用su命令来直接切换到root用户的,但是如果没有给r ...

  7. [转]谷歌Chrome浏览器开发者工具教程—JS调试篇

    来源:http://blog.csdn.net/cyyax/article/details/51242720 上一篇我们学习了谷歌Chrome浏览器开发者工具的基础功能,下面介绍的是Chrome开发工 ...

  8. ef linq 查询某时间段内数据 踩的坑

    var now = DateTime.Now;var list =db.Jinbi_TypeLimit.Where(x => x.IsAvailable && x.JinbiTy ...

  9. 微信小程序问题总结

    1.navigator不能跳转到tabBar所包含的页面 例如: tabbar包含center页面,不包含page1页面,使用如下跳转: <navigator url='../center/ce ...

  10. node:fs-extra模块

    var fs = require('fs-extra'); //复制 并会覆盖已有文件 fs.copy('./demo/index.html','./demo/index2.html' ,(err) ...