windows下FreeImage编译
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编译相关推荐
- Boost在Linux和windows下的编译 32位 64位
一 简言 1. Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一 2. Boost官网地址:http://www.boost.org/ 3. 本博客示 ...
- tinyxml在linux和windows下的编译及使用详解
一:摘要 1.XML全称EXtensible Markup Language,翻译为可扩展标记语言,XML文件通常就是一个文本文件,可以使用任何编码 2.TinyXML是一个开源的C++用来处理XML ...
- jsoncpp在linux和windows下的编译及使用详解
一:摘要 1. JSON是一种轻量级的数据传输格式,全称为:JavaScript Object Notation,官方网址: http://www.json.org/json-zh.html 3. J ...
- Windows下MinGW编译vim7.4
学习了一段时间Vim,感觉有些功能真的很方便.因学习原因,工作平台更换到一台老式Xp电脑上,重新安装了Vim7.4.官网默认版本不支持等宽字体和GDI++渲染,需要手工编译一个修改过的版本. 1.下载 ...
- Agg在Windows下的编译与使用
Agg在Windows下的编译与使用 flyfish Agg简介 AGG(Anti-Grain Geometry)是一个开源免费的图形库. 官网地址: www.antigrain.com 主要是编译称 ...
- ncnn环境搭建一 - windows下protobuf编译安装
1. 环境 安装环境采用visual studio 2015 + protobuf 3.4.0 + ncnn 2. visual studio 2015安装 visual studio采用的是 vs2 ...
- 【转载】【VSCode】Windows下VSCode编译调试c/c++
转载自:http://blog.csdn.net/c_duoduo/article/details/51615381 懒得自己配置或自己配置出现不明问题的朋友可以点这里: [VSCode]Windo ...
- windows下cmake编译VTK到PCL中
补充: 如果嫌编译麻烦,这里可以下载我编译好的:VTK-8.0.1,下载后直接拷贝到pcl安装目录下替换原VTK目录. 编译VTK的原因: pcl安装版中自带的vtk缺少QVTKWidget.dll, ...
- 开源的excel读取库libxls在windows下的编译,且支持中文,全网首发
转载请注明出处:http://www.cnblogs.com/superbi/p/5482516.html 到目前为止,网络和官网上并没有关于libxls在windows下支持中文的教程,也没有现成的 ...
- VLC-3.0.0(Nightly版)在Linux和Windows下的编译步骤详解
VLC 3.0.0 Compile vlc的编译一直是个大坑,做过音视频开发的不少人想必都踩过,开篇引用官方wiki一句话: Compiling VLC is not an easy task. 本文 ...
最新文章
- [EasyTao(道)系列文章之一]太极之道
- 用7*7的卷积核分类9*9的图片到底应该用几个卷积核?55个
- 在java中会存在内存泄漏吗?
- php四则运算出题器_四则运算出题器3
- Java读取xml数据
- Ubuntu实现树莓派交叉编译
- python利用有道词典翻译_使用Python从有道词典网页获取单词翻译
- 转:gcc编译C++程序
- shell 简介(常用shell之bash)
- 比较awk python: [文件]web日志信息统计 。 [命令]netstat命令状态统计
- html设计有项目的页面,HTML+CSS项目开发经验总结(推荐)
- 5天学python_人生苦短,我将学习Python基本句子(第5天),我学,基础,篇,语句,Day5...
- Rootkit 后门的利用
- office文档转换为html,OFFICE 文档转换为html在线预览
- 对接金蝶云星空审批流
- IMDB排名前100名经典电影
- Java中的“无限循环”结构
- iOS开发bug消灭之:Your application has presented a UIAlertController of style ...
- 携程Java后台开发面经
- Facebook使用虚拟信用卡养广告账户扣费跑广告实用技巧