windows下FreeImage编译

article/2025/10/12 18:56:13

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位。

源码下载

参考

拳四郎


http://chatgpt.dhexx.cn/article/rJOJTxiw.shtml

相关文章

Qt Creator配置FreeImage库

第零步&#xff1a;前言 根据官网介绍&#xff1a; FreeImage 是一个开源库项目&#xff0c;面向希望支持当今多媒体应用程序所需的流行图形图像格式&#xff08;如 PNG&#xff0c;BMP&#xff0c;JPEG&#xff0c;TIFF 和其他格式&#xff09;的开发人员。FreeImage 易于使用…

FreeImage

freeimage.lib下载地址&#xff1a; http://freeimage.sourceforge.net/ FreeImage is an Open Source library project for developers who would like to support popular graphics image formats like PNG, BMP, JPEG, TIFF and others as needed by todays multimedia ap…

FreeImage库的配置及部分使用(windows)

1、首先下载FreeImage库&#xff0c;http://freeimage.sourceforge.net/download.html&#xff0c;下载如下 2、解压后&#xff0c;如下图所示&#xff1a; 打开2013sln&#xff0c;编译FreeImageLib这个项目&#xff08;设为启动项&#xff09;&#xff0c;根据debug/release版…

void *的使用

void * 为 “不确定类型指针”。 void *不可以解引用 &#xff08;1&#xff09;void *可以接受任何类型的赋值&#xff1a; 任何类型的指针都可以直接赋值给void *型指针&#xff0c;无需进行强制类型转换&#xff0c;相当于void *包含了其他类型的指针。 &#xff08;2&a…

C语言中void的高级应用

C语言中void的高级应用 C语言中的void关键字&#xff0c;void 表示为“无”、“空”、“没有”的意思。所以void是不能用来定义变量的&#xff0c;因为变量是需要固定的空间的 //定时时&#xff0c;编译不通过 void ch a; void a 10;一、void的常用场景 1.1 函数的参数 v…

【C语言】void 和 void* 类型

一. void 类型 1. 为何不能定义 void 类型的变量 为什么不能定义 void 类型的变量&#xff1f;因为它是空类型&#xff0c;不能够为变量提供空间吗&#xff1f; 定义变量的本质是开辟空间&#xff0c;我们用 sizeof 来计算 void 类型的大小&#xff1a; 在vs2017下&#xf…

函数类型——void(无类型函数)

void属于函数类型中的无类型函数之对应的还有实型&#xff08;float,double&#xff09;&#xff0c;整型&#xff08;int&#xff09;&#xff0c;布尔型&#xff08;bool&#xff09;和字符型&#xff08;char&#xff09;。 在介绍void之前先介绍“返回值”&#xff1a; 就…

C语言中的void*是什么?

目录 1.void *是什么2.void*的解引用3.void*类型的应用场景 1.void *是什么 我们之前学过许多类型的指针变量&#xff0c;如整形指针&#xff0c;字符指针&#xff0c;甚至数组指针&#xff0c;函数指针等。 int a 10; int *pa &a;//整形指针pa接受一个整形变量a的地址…

C语言中的void类型函数

最重要的一点是void类型函数里不能出现return语句 &#xff0c;因为与常见的int double float char等数据类型不同&#xff0c;void是一个空类型&#xff0c;也就是说函数没有返回值&#xff0c;所以也不给主函数提供&#xff08;或返回&#xff09;任何信息 一般声明变量时不…

【C语言】如何理解【void(*)(void)】

1.理解【void(*)(void)】 引用阅读 如何理解【void(*)(void)】 void(*)(void) --表示一个返回值为void&#xff0c;没有参数的函数指针 (void(*)(void))--表示【将func这个函数强转成返回值为void&#xff0c;没有参数的函数】的类型转换 测试sizeof(void(*)(void)) #inc…

C语言中的void

文章目录 一.void概要二.void应用场景2.1void能定义变量吗&#xff1f;2.2void这个类型有大小吗&#xff1f;2.3void*能定义变量吗&#xff1f;2.4void*使用2.5void*能不能进行对应的指针运算&#xff1f;2.6void和函数返回值2.7函数void类型的参数 一.void概要 void就是空的意…

C语言 --- void的用法解析

文章目录 一、简介二、用法三、总结 一、简介 ​ void 中文翻译为"无类型"&#xff0c;有的也叫"空类型"。常用在程序中对定义函数的参数类型、返回值、函数中指针类型进行声明。 二、用法 首先应该注意一点的是void类型是不同于其他常见类型的&#xf…

Python爬虫实现英汉互译

用requests模块实现英汉词汇简单互译 1.找到地址&#xff1a; 2.完成代码&#xff1a; import jsonimport requestsurl "https://fanyi.baidu.com/sug" headers {"User-Agent": Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit…

Python 爬虫笔记

Python 爬虫笔记 HTTP协议requests模块get() 和post()函数headers 数据解析正则表达式bs4解析-HTML语法Xpath 批量爬取百度图片selenium 毕设与图像分类相关&#xff0c;所以需要大量的图片数据&#xff0c;所以先学学爬虫爬图片。 本文作为自学笔记&#xff0c;仅供参考 声明&…

爬虫入门练习

目录 网络爬虫一、爬取[南阳理工OJ题目](http://www.51mxd.cn/problemset.php-page1.htm)python代码结果 二、爬取[重交新闻](http://news.cqjtu.edu.cn/xxtz.htm)python代码结果 小结 网络爬虫 简介 网络爬虫英文名叫Web Crawler戒WebSpider。是一种自动浏览网页并采集所需要…

python爬虫网络中断_python爬虫中断

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; 当redis的队列为空时&#xff0c;爬虫会重新爬取&#xff1b; 当队列不为空时&#xff0c;爬虫便会接着上次…

爬虫知识综合

1. Scrapy怎么设置深度爬取? 通过在settings.py中设置DEPTH_LIMIT的值可以限制爬取深度&#xff0c;这个深度是与start_urls中定义url的相对值。也就是相对url的深度。若定义url为http://www.domz.com/game/,DEPTH_LIMIT1那么限制爬取的只能是此url下一级的网页。深度大于设…

爬虫之异步爬虫asyncio

与异步爬虫的相见 文章目录 一、asynico是什么&#xff1f;二、使用步骤 1.普通用法2,在爬虫里面的用法 一、asynico是什么&#xff1f; 简言之&#xff0c;就是用这个库可以来实现异步IO 二、使用步骤 1&#xff0c;普通用法 1&#xff0c;下面我们来看一个案例&#xff1…

网络爬虫之规则

网络爬虫之规则 一.Requests库的get()方法1.1requests库的安装1.2 测试requests库的效果1.3 requests库的7个主要方法1.4 requests中的get方法1.5 Response对象的属性&#xff08;牢记&#xff09;1.6 理解Response的编码1.7 对以上知识的讲解运用 二.爬取网页的通用代码框架2.…

网络爬虫入门学习

文章目录 一、初识网络爬虫1.1 网络爬虫定义1.2 爬虫原理1.3 爬虫工作的过程 二、示例一2.1 需要的内置库以及第三方库2.2 具体代码2.3 结果展示&#xff1a; 三、示例二3.1 确定要爬取信息的位置3.2 具体代码3.3 结果展示 四、总结五、参考文献 一、初识网络爬虫 1.1 网络爬虫…