c语言freeimage库文件,FreeImage使用方法amp;FreeImage Tutorial

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

前言 四大图像库:OpenCV:功能十分的强大,而且支持目前先进的图像处理技术,体系十分完善,操作手册很详细,手册首先给大家补计算机视觉的知识,几乎涵盖了近10年内的主流算法;

http://sourceforge.net/projects/opencvlibrary/

FreeImage :非常好用的开源图像库,支持二十多种类型的图像和多种图像处理功能。只需一个头文件、一个静态库、一个动态链接库即可。目前还不支持矢量图。C语言的体系,大量使用指针运算速度可以保证,内含先进的多种插值算法。

http://freeimage.sourceforge.net/

CImg :就一个.h文件所以用起来很简明,但感觉功能上不如CxImage。

可以与CxImage配合使用,因为CImg提供了基于lapack的矩阵运算函数和完善的线性滤波卷积函数,同时CImg做像素运算还是很方便的。

http://cimg.sourceforge.net/

CxImage:有一个界面很强的demo程序,

http://www.xdp.it/cximage.htm

FreeImage使用方法

FreeImage支持20多种图像类型的(如BMP、JPEG、GIF、PNG、TIFF等)图像处理库。如下图FreeImage允许的位图格式:

ec47232be59567fd48d35589b0394ddd.pngFreeImage的使用例子好像很少,这里以Visual Studio 2008+SP1为例说明怎么使用FreeImage图形库。

FreeImage下载是在http://freeimage.sourceforge.net/ ,解压缩后里面有个Dist的文件夹,这里面的五个文件就是我们用FreeImage所需要的全部东东了,即FreeImage.lib、FreeImage.dll、FreeImaged.lib、FreeImaged.dll、FreeImage.h,以d 结尾的库文件用于Debug版本,没有的用于Release版本的。

一、新建一个名称为FITest的MFC单文档应用程序,将FreeImage中的Dist文件夹添加到“工具->选项->项目和解决方案->VC++目录”中的“包含文件”与“库文件”中;

二、初始化

(1)、在stdafx.h 文件中加入如下代码:

#include"FreeImage.h"#ifdef _DEBUG#pragma comment(lib, "FreeImaged.lib")#else#pragma comment(lib, "FreeImage.lib")#endif(2)、例外默认情况下,FreeImage 被当作动态链接库。若需用作静态链接库,则在应用程序类的InitInstance 中调用FreeImage_Initialise(0)来初始化FreeImage库。

(3)、重载ExitInstance 并在其中调用FreeImage_DeInitialise()释放FreeImage 库。这个必须在程序的结尾处唯一地一次调用该函数,以清除FreeImage库在内存中分配的内存,不然会造成很严重的内存泄露。

int CFITestApp::ExitInstance()

{

// TODO: 在此添加专用代码和/或调用基类

FreeImage_DeInitialise();

return CWinAppEx::ExitInstance();

}

三、读取图像

(1)、给CFITestDoc类添加一个public变量

FIBITMAP *m_handleFI;

在类的构造函数添加 :m_handleFI(NULL) 字样,即

CFITestDoc::CFITestDoc():m_handleFI(NULL)

{

// TODO: 在此添加一次性构造代码

}

(2)、给CFITestDoc类添加两个函数,FreeDIB ()和LoadDIB(LPCTSTR lpszPathName, int flag)

函数代码如下

FIBITMAP*  CFITestDoc::LoadDIB(LPCTSTR lpszPathName, int flag)

{

FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;

fif = FreeImage_GetFileType(lpszPathName);  // ansi情况下,LPCTSTR 就是 const char*, 是常量字符串

if(fif == FIF_UNKNOWN)

fif  =  FreeImage_GetFIFFromFilename(lpszPathName);

if((fif != FIF_UNKNOWN) && FreeImage_FIFSupportsReading(fif))

{

FIBITMAP *dib = FreeImage_Load(fif,lpszPathName, flag);

return dib;

}

return NULL;

}

void CFITestDoc::FreeDIB(void)

{

if(m_handleFI)

{

FreeImage_Unload(m_handleFI);// 释放位图

m_handleFI = NULL;

}

}

(3)、在析构函数中释放位图

CFITestDoc::~CFITestDoc()

{

FreeDIB();

}(4)、为CFITestDoc类添加ID_FILE_OPEN的COMMAND事件响应函数OnFileOpen()

void CFITestDoc::OnFileOpen()

{

FIBITMAP* pFI = NULL;

CString szFilter("BMP file(*.bmp)|*.bmp|GPEG file(*.jpg)|*.jpg|All files(*.*)|*.*||");

CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY, szFilter);

if(dlg.DoModal() == IDOK)

{

CString strPath = dlg.GetPathName();

pFI = LoadDIB(strPath, 0);

if(pFI)

{

FreeDIB();// 释放以前的位图

m_handleFI = pFI;// 指向新位图

UpdateAllViews (NULL);

}

}

}

四、显示图像

在视图类CFITestView中的OnDraw()函数添加代码

void CFITestView::OnDraw(CDC* pDC)   //记得去掉注释掉的pDC

{

CFITestDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

// TODO: 在此处为本机数据添加绘制代码FIBITMAP *pFI = pDoc->m_handleFI;if(pFI){BYTE* pBits = FreeImage_GetBits(pFI);

BITMAPINFO* pIf=FreeImage_GetInfo(pFI);int W = FreeImage_GetWidth(pFI);

int H = FreeImage_GetHeight(pFI);

CRect rectClient;GetClientRect(rectClient);

int dstW = rectClient.Width();

int dstH = rectClient.Height();

::SetStretchBltMode(pDC->GetSafeHdc(),COLORONCOLOR);

if(dstW == W && dstH == H)

{

::SetDIBitsToDevice(pDC->GetSafeHdc(),0,0, W, H,0,0,0, H,pBits,pIf,DIB_RGB_COLORS);

}

else {// 按比例缩放

float fScale=(float)(W*dstH)/(float)(H*dstW);

if(fScale > 1.0f)

dstH = (int) (dstH / fScale);

else

dstW = (int) (dstW * fScale);

::StretchDIBits(pDC->GetSafeHdc(),0,0,dstW,dstH,0,0,W,H,pBits,pIf,DIB_RGB_COLORS,SRCCOPY);

}

}

}

五、调试程序

调试程序要注意了,可能在LoadDIB函数中出现错误,提示LPCTSTR不能转换成const char * ,本来在ANSI下两者是一样的,设置一下项目属性。

按Alt+F7快捷键,如下图,设置字符集为【使用多字节字符集】

8d38ec397152d429aec72419c98afa59.png

记得把FreeImaged.dll拷贝到...\FITest\Debug下,FreeImage.dll拷贝到...\FITest\Release目录下。或都拷贝到C:\WINDOWS\system32\下也行。

按Ctrl+F5运行程序。

9041d35e76ebc20ccaf83ed9750f2751.png

点击 【文件】->【打开】打开一张图片。。。。。。。

59a7ecbb316bece84a86122f372d726a.png

8d6380bb56aa745cba6eead784662e3f.png

参考资料:源代码:http://freeimage.sourceforge.net/

FreeImage 3.8.0 中文文档

http://cdnetworks-kr-2.dl.sourceforge.net/project/freeimage/Source%20Documentation/3.8.0/FreeImage380Chinese.pdf

Internet ...


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

相关文章

windows下FreeImage编译

windows下FreeImage编译 FreeImage下载 FreeImage下载地址 点击左边的“Download” 选择 “Download FreeImage 3.18.0 [WIN32/WIN64]” vs2019打开工程 下载后解压,直接打开:FreeImage.2017.sln 生成dll、lib文件 接下来编译C Wraper的 测试工程…

Qt Creator配置FreeImage库

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

FreeImage

freeimage.lib下载地址: 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库,http://freeimage.sourceforge.net/download.html,下载如下 2、解压后,如下图所示: 打开2013sln,编译FreeImageLib这个项目(设为启动项),根据debug/release版…

void *的使用

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

C语言中void的高级应用

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

【C语言】void 和 void* 类型

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

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

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

C语言中的void*是什么?

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

C语言中的void类型函数

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

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

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

C语言中的void

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

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

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

Python爬虫实现英汉互译

用requests模块实现英汉词汇简单互译 1.找到地址: 2.完成代码: 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 毕设与图像分类相关,所以需要大量的图片数据,所以先学学爬虫爬图片。 本文作为自学笔记,仅供参考 声明&…

爬虫入门练习

目录 网络爬虫一、爬取[南阳理工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云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 当redis的队列为空时,爬虫会重新爬取; 当队列不为空时,爬虫便会接着上次…

爬虫知识综合

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

爬虫之异步爬虫asyncio

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

网络爬虫之规则

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