windows下FreeImage编译

FreeImage下载

FreeImage下载地址


点击左边的“Download”

选择 “Download FreeImage 3.18.0 [WIN32/WIN64]”

vs2019打开工程

下载后解压,直接打开:FreeImage.2017.sln

生成dll、lib文件

接下来编译C++ Wraper的 测试工程

接下来编译C++ Wraper的 测试工程

X:\FreeImageSource\Wrapper\FreeImagePlus\test\fipTest.2008.sln

将最外面的test.jpg拷贝到运行目录,挨个执行四个测试。

可能遇到的问题

找不到头文件

在这里添加头文件的目录

找不到lib

在下面的位置添加

这不到dll

将对应的dll拷贝到程序运行目录

测试程序崩溃

将test.jpg拷贝到运行目录。

简单使用
创建一个工程,还有要用到一张图片。

(Please call me LeiFeng.)

首先来最简单的,加载一张JPEG图片。

#include “stdafx.h”
#include
#include “FreeImagePlus.h”

int _tmain(int argc, _TCHAR* argv[])
{
FreeImage_Initialise(TRUE);
FIBITMAP * JPEG = FreeImage_Load(FIF_JPEG, “test.jpg”, JPEG_DEFAULT);
//获取影像的宽高,都以像素为单位
int Width = FreeImage_GetWidth(JPEG);
int Height = FreeImage_GetHeight(JPEG);
std::cout << "Width: " << Width << "\nHeight: " <<Height << std::endl;
FreeImage_Unload(JPEG);
FreeImage_DeInitialise();
return 0;
}

颜色调整

常见的图片颜色调整FreeImage都已经实现,调用对应的接口就可以了。这里调用一个反色,还有一个调整曲线。

(容我先擦一下鼻血)

代码

FreeImage_AdjustContrast(JPEG, 15.0);
FreeImage_AdjustBrightness(JPEG, 50.0);

//FreeImage_Invert(JPEG);
if (JPEG)
{
FreeImage_Save(FIF_BMP, JPEG, “test.bmp”, BMP_DEFAULT);
}

gif的拷贝

从一张gif生成一张一模一样的gif

BOOL bMemoryCache = TRUE;fipMultiPage src(bMemoryCache);
fipMultiPage dst(bMemoryCache);// You MUST declare this before using it.
// We will use the assignement operator, i.e. operator=()
fipImage image;// Open src file (read-only, use memory cache)
src.open("example.gif", FALSE, TRUE);if (src.isValid()) {// Open dst file (creation, use memory cache)dst.open("output.gif", TRUE, FALSE);// Get src page countint count = src.getPageCount();// Clone src to dstfor (int page = 0; page < count; page++) {// Load the bitmap at position 'page'image = src.lockPage(page);if (image.isValid()) {// add a new bitmap to dstdst.appendPage(image);// Unload the bitmap (do not apply any change to src)src.unlockPage(image, FALSE);}}
}
std::cout << FreeImage_GetPageCount(dst) << std::endl;// Close srcsrc.close(0);// Save and close dstdst.close();

查看gif的metadate

fipMultiPage src(bMemoryCache);src.open("example.gif", FALSE, TRUE);
fipImage image;
image = src.lockPage(0);
fipMetadataFind finder;
if (finder.findFirstMetadata(FIMD_ANIMATION, image, tagg)) {do {// process the tagconst void * p = tagg.getValue();DWORD* pp = (DWORD *)p;cout << "process the tag :" << tagg.getKey() << " " <<tagg.getType()<< " " << *pp << endl;tagVector.push_back(tagg);} while (finder.findNextMetadata(tagg));
}

最后用完记得unlockPage.
随便加载一个gif,得到对用的tag有下面这些

其中最重要的是FrameTime,表示帧占用的时间,单位是毫秒。其次是Loop,是一只循环播放(0)还是循环一次(1),

从静态图片生成gif

先下载几个png

这个问题卡了我将近一天,文档上全是坑。

先上文档中专门说gif生成的代码

// assume we have an array of dibs which are already 8bpp and all the same size,
// and some float called fps for frames per second
FIMULTIBITMAP *multi = FreeImage_OpenMultiBitmap(FIF_GIF, “output.gif”, TRUE, FALSE);
DWORD dwFrameTime = (DWORD)((1000.0f / fps) + 0.5f);
for(int i = 0; i < 10; i++ ) {
// clear any animation metadata used by this dib as we’ll adding our own ones
FreeImage_SetMetadata(FIMD_ANIMATION, dib[i], NULL, NULL);
// add animation tags to dib[i]
FITAG *tag = FreeImage_CreateTag();
if(tag) {
FreeImage_SetTagKey(tag, “FrameTime”);
FreeImage_SetTagType(tag, FIDT_LONG);
FreeImage_SetTagCount(tag, 1);
FreeImage_SetTagLength(tag, 4);
FreeImage_SetTagValue(tag, &dwFrameTime);
FreeImage_SetMetadata(FIMD_ANIMATION, dib[i], FreeImage_GetTagKey(tag), tag);
FreeImage_DeleteTag(tag);
}
FreeImage_AppendPage(multi, dib[i]);
}
FreeImage_CloseMultiBitmap(multi);

似乎先创建一个multiBitmap,然后各种appendPage就可以了。

Too Young.

先看一下gif的文件格式

GIF格式,是为使图片能够应用在在线(online)应用程序上所特别开发的图片格式。Gif,有时也被成为“Giff”,是一种无损,8位图片格式。“无损”是指100%的保持原始图片的像素数据信息。专业名词“8位”是指,所能表现的颜色深度——一个8位图像仅最多只能支持256种不同颜色(一个多余256种颜色的图片若用gif图片保存会出现失真)。

So,上面的那个png是32bit的,不是8位的图片是Append不上的,那就转格式呗。

自带一个convertTo8Bits的方法,但是转换出来是灰度的。

上论坛搜索答案,告知就是这样的。

要用一个colorQuantize方法,结果完全无效,上论然搜,告知要24位的图片才能转。

继续转呗,透明的部分全部变黑。

论坛上搜索无果,回头继续看png的格式

PNG图片类型
PNG格式有8位、24位、32位三种,下面是一些术语:

索引透明:类似于GIF,某一像素只有全透和全不透明两种效果
Alpha透明:半透明
PNG8 - 8位的PNG最多支持256(2的8次方)种颜色,8位的PNG支持索引透明和alpha透明。
PNG24 - 支持2的24次方种颜色,但不支持透明信息。
PNG32 - 32位的PNG在24位的PNG基础上增加了8位的透明信息,因此支持不同程度的半透效果。

默默地打开屁艾斯(PS),加载图片,存储为Web所用格式。

重新用代码记载,appendpage,全世界都安静了。

代码清单(用的plus的wraper)

#include “stdafx.h”
#include
#include “FreeImagePlus.h”
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

BOOL bMemoryCache = TRUE;fipMultiPage dst(bMemoryCache);fipImage image1;
image1.load("11.png");
fipImage image2;
image2.load("2.png");
fipImage image3;
image3.load("3.png");image2.convertTo24Bits();
image2.colorQuantize(FIQ_WUQUANT);
image3.convertTo24Bits();
image3.colorQuantize(FIQ_WUQUANT);float fps = 3.0f;
DWORD dwFrameTime = (DWORD)((1000.0f / fps) + 0.5f);
fipTag tag;
tag.setKey("FrameTime");
tag.setType(FIDT_LONG);
tag.setCount(1);
tag.setLength(4);
tag.setValue(&dwFrameTime);
const void * p = tag.getValue();
DWORD* pp = (DWORD *)p;
cout << "Tag" << tag.getKey() << " " << *pp << endl;//Set the loop of gif 0->loop forever 1->loop only once.
DWORD bloop = (DWORD)(1);
fipTag loopTag;
loopTag.setKey("Loop");
loopTag.setType(FIDT_LONG);
loopTag.setCount(1);
loopTag.setLength(4);
loopTag.setValue(&bloop);image1.setMetadata(FIMD_ANIMATION, tag.getKey(), tag);
image2.setMetadata(FIMD_ANIMATION, tag.getKey(), tag);
image3.setMetadata(FIMD_ANIMATION, tag.getKey(), tag);image1.setMetadata(FIMD_ANIMATION, loopTag.getKey(), loopTag);
image2.setMetadata(FIMD_ANIMATION, loopTag.getKey(), loopTag);
image3.setMetadata(FIMD_ANIMATION, loopTag.getKey(), loopTag);dst.open("output.gif", TRUE, FALSE);dst.appendPage(image1);
dst.appendPage(image2);
dst.appendPage(image3);dst.close(); return 0;

}

最终效果,guang~

第一张png是由ps导出的8位png,后面的两张用代码转的8位。

源码下载

参考

拳四郎

windows下FreeImage编译相关推荐

  1. Boost在Linux和windows下的编译 32位 64位

    一 简言 1. Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一 2. Boost官网地址:http://www.boost.org/ 3. 本博客示 ...

  2. tinyxml在linux和windows下的编译及使用详解

    一:摘要 1.XML全称EXtensible Markup Language,翻译为可扩展标记语言,XML文件通常就是一个文本文件,可以使用任何编码 2.TinyXML是一个开源的C++用来处理XML ...

  3. jsoncpp在linux和windows下的编译及使用详解

    一:摘要 1. JSON是一种轻量级的数据传输格式,全称为:JavaScript Object Notation,官方网址: http://www.json.org/json-zh.html 3. J ...

  4. Windows下MinGW编译vim7.4

    学习了一段时间Vim,感觉有些功能真的很方便.因学习原因,工作平台更换到一台老式Xp电脑上,重新安装了Vim7.4.官网默认版本不支持等宽字体和GDI++渲染,需要手工编译一个修改过的版本. 1.下载 ...

  5. Agg在Windows下的编译与使用

    Agg在Windows下的编译与使用 flyfish Agg简介 AGG(Anti-Grain Geometry)是一个开源免费的图形库. 官网地址: www.antigrain.com 主要是编译称 ...

  6. ncnn环境搭建一 - windows下protobuf编译安装

    1. 环境 安装环境采用visual studio 2015 + protobuf 3.4.0 + ncnn 2. visual studio 2015安装 visual studio采用的是 vs2 ...

  7. 【转载】【VSCode】Windows下VSCode编译调试c/c++

    转载自:http://blog.csdn.net/c_duoduo/article/details/51615381 懒得自己配置或自己配置出现不明问题的朋友可以点这里:  [VSCode]Windo ...

  8. windows下cmake编译VTK到PCL中

    补充: 如果嫌编译麻烦,这里可以下载我编译好的:VTK-8.0.1,下载后直接拷贝到pcl安装目录下替换原VTK目录. 编译VTK的原因: pcl安装版中自带的vtk缺少QVTKWidget.dll, ...

  9. 开源的excel读取库libxls在windows下的编译,且支持中文,全网首发

    转载请注明出处:http://www.cnblogs.com/superbi/p/5482516.html 到目前为止,网络和官网上并没有关于libxls在windows下支持中文的教程,也没有现成的 ...

  10. VLC-3.0.0(Nightly版)在Linux和Windows下的编译步骤详解

    VLC 3.0.0 Compile vlc的编译一直是个大坑,做过音视频开发的不少人想必都踩过,开篇引用官方wiki一句话: Compiling VLC is not an easy task. 本文 ...

最新文章

  1. [EasyTao(道)系列文章之一]太极之道
  2. 用7*7的卷积核分类9*9的图片到底应该用几个卷积核?55个
  3. 在java中会存在内存泄漏吗?
  4. php四则运算出题器_四则运算出题器3
  5. Java读取xml数据
  6. Ubuntu实现树莓派交叉编译
  7. python利用有道词典翻译_使用Python从有道词典网页获取单词翻译
  8. 转:gcc编译C++程序
  9. shell 简介(常用shell之bash)
  10. 比较awk python: [文件]web日志信息统计 。 [命令]netstat命令状态统计
  11. html设计有项目的页面,HTML+CSS项目开发经验总结(推荐)
  12. 5天学python_人生苦短,我将学习Python基本句子(第5天),我学,基础,篇,语句,Day5...
  13. Rootkit 后门的利用
  14. office文档转换为html,OFFICE 文档转换为html在线预览
  15. 对接金蝶云星空审批流
  16. IMDB排名前100名经典电影
  17. Java中的“无限循环”结构
  18. iOS开发bug消灭之:Your application has presented a UIAlertController of style ...
  19. 携程Java后台开发面经
  20. Facebook使用虚拟信用卡养广告账户扣费跑广告实用技巧

热门文章

  1. Sybase数据库安全
  2. Xshell的安装及使用超详细教程
  3. IDEA中快速创建jsp页面模板
  4. 分享一种MODIS数据下载方法
  5. 【OR】YALMIP 鲁棒优化
  6. 3DMAX渲染很卡很慢?8个3dsMax中节省建模和渲染时间的技巧-瑞云渲染
  7. dct变换编码研究课设实验报告_信息隐藏实验3
  8. 配置修改Tomcat端口
  9. 计算机端口25,在Windows 下关闭21\23\25端口的方法 -电脑资料
  10. 360安全卫士 免杀