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); 
<span class="hljs-comment">// 文件名
<span class="hljs-keyword">const <span class="hljs-keyword">char* imageFile = <span class="hljs-string">"lenna.png";
<span class="hljs-keyword">const <span class="hljs-keyword">char* saveFile = <span class="hljs-string">"lenna_rotate.png";

<span class="hljs-comment">// 图片格式
FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;

<span class="hljs-comment">// 获取图片格式
<span class="hljs-comment">/* 此处需要特别注意,即使后缀名是.png并不代表图片格式就真是PNG格式,这里先通过FreeImage_GetFileType函数获取图片格式,
然后再进行加载,否则,也许会出现加载失败的情况。
*/
fif = FreeImage_GetFileType(imageFile);
<span class="hljs-keyword">if (fif == FIF_UNKNOWN)
    fif = FreeImage_GetFIFFromFilename(imageFile);

FIBITMAP *bitmap1 = NULL;
FIBITMAP *bitmap2 = NULL;
<span class="hljs-keyword">if ((fif != FIF_UNKNOWN) &amp;&amp; FreeImage_FIFSupportsReading(fif)){
    bitmap1 = FreeImage_Load(fif, imageFile, PNG_DEFAULT);
}
<span class="hljs-keyword">if (!bitmap1){
    <span class="hljs-built_in">fprintf(stderr, <span class="hljs-string">"Fail to Load Image!\n");
    <span class="hljs-built_in">exit(-<span class="hljs-number">1);
}
<span class="hljs-keyword">else{
    FreeImage_Save(fif, bitmap1, saveFile, PNG_DEFAULT);
    bitmap2 = FreeImage_Load(fif, saveFile, PNG_DEFAULT);
    <span class="hljs-keyword">if (!bitmap2){
        <span class="hljs-built_in">fprintf(stderr, <span class="hljs-string">"Fail to Load saved Image!\n");
        <span class="hljs-built_in">exit(-<span class="hljs-number">1);
    }
}

<span class="hljs-comment">// 获取影像的宽高,都以像素为单位
<span class="hljs-keyword">int width = FreeImage_GetWidth(bitmap1);
<span class="hljs-keyword">int height = FreeImage_GetHeight(bitmap1);

<span class="hljs-comment">// 获取总共的像素数目
<span class="hljs-keyword">int pixel_num = width*height;

<span class="hljs-comment">// 获取保存每个像素的字节数 这里为3,分别为RGB
<span class="hljs-keyword">unsigned <span class="hljs-keyword">int byte_per_pixel = FreeImage_GetLine(bitmap1) / width;

<span class="hljs-built_in">printf(<span class="hljs-string">"Width:%d\t Height:%d\t 像素总数:%d\t 每像素字节数:%d\n", width, height, pixel_num, byte_per_pixel);

<span class="hljs-comment">// 获取保存图片的字节数组
<span class="hljs-keyword">unsigned <span class="hljs-keyword">char *bits1 = FreeImage_GetBits(bitmap1);
<span class="hljs-keyword">unsigned <span class="hljs-keyword">char *bits2 = FreeImage_GetBits(bitmap2);

<span class="hljs-comment">// 获取每个像素对应的RGB
<span class="hljs-keyword">unsigned <span class="hljs-keyword">char *reds = <span class="hljs-keyword">new <span class="hljs-keyword">unsigned <span class="hljs-keyword">char[pixel_num];
<span class="hljs-keyword">unsigned <span class="hljs-keyword">char *greens = <span class="hljs-keyword">new <span class="hljs-keyword">unsigned <span class="hljs-keyword">char[pixel_num];
<span class="hljs-keyword">unsigned <span class="hljs-keyword">char *blues = <span class="hljs-keyword">new <span class="hljs-keyword">unsigned <span class="hljs-keyword">char[pixel_num];

<span class="hljs-keyword">int cur = <span class="hljs-number">0;
<span class="hljs-keyword">for (<span class="hljs-keyword">int x = <span class="hljs-number">0; x &lt; pixel_num; ++x){
    <span class="hljs-comment">// 这里对应于上述的每个像素的字节数:3
    reds[x] = bits1[cur++];
    greens[x] = bits1[cur++];
    blues[x] = bits1[cur++];
}

<span class="hljs-comment">// 反序更新saveFile的字节数组
cur = <span class="hljs-number">0;
<span class="hljs-keyword">for (<span class="hljs-keyword">int x = pixel_num - <span class="hljs-number">1; x &gt;= <span class="hljs-number">0; --x){
    bits2[cur++] = reds[x];
    bits2[cur++] = greens[x];
    bits2[cur++] = blues[x];
}

<span class="hljs-comment">// 保存更新后的图片
FreeImage_Save(fif, bitmap2, saveFile, PNG_DEFAULT);

<span class="hljs-comment">// 从内存中删除载入图片,防止内存泄漏
FreeImage_Unload(bitmap1);
FreeImage_Unload(bitmap2);
<span class="hljs-comment">// 撤销初始化
FreeImage_DeInitialise();

<span class="hljs-keyword">return <span class="hljs-number">0;

}


上述代码运行后会在给定工程下的testFreeImage/下生成lenna_rotate.png图片,为原先图片旋转后的图片。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值