FreeImage使用方法
FreeImage使用方法
一、FreeImage 简介
FreeImage 是一款免费的、开源的、跨平台(Windows 、Linux 和Mac OS X )的,支持20 多种图像类型的(如BMP 、JPEG 、GIF 、PNG 、TIFF 等)图像处理库。其最大优点就是采用插件驱动型架构,具有快速、灵活、简单易用的特点,得到了广泛使用。相关的源码、库文件及帮助文档可以从http://freeimage.sourceforge.net/ 免费下载使用。下载最新的FreeImage 3.14.1 [WIN32], 解压缩该FreeImage3141Win32.zip文件,包含FreeImage.h、FreeImage.lib和 FreeImage.dll文件。
FreeImage 的主要功能有多格式位图的读写;方便的位图信息获取;位深度转换;位图页面访问;基本的几何变换和点处理;通道合并与混合等。FreeImage 暂时不支持矢量图形和高级图像处理,位图绘制需要由用户来完成。 FreeImage 中的所有函数都以FreeImage_ 开头,如图像文件的读写函数分别为FreeImage_Load 和FreeImage_Save 。FIBITMAP 数据结构保存着位图信息和像素数据,是FreeImage 的核心。
二、初始化 FreeImage
FreeImage 主要包含头文件FreeImage.h 、静态链接库FreeImage.lib 、FreeImaged.lib ,动态链接库FreeImage.dll 和FreeImaged.dll 。其中,以d 结尾的库文件用于调试版,其余用于发行版。为了在VC 中使用FreeImage方法如下:
#i nclude"FreeImage.h"
#ifdef _DEBUG
#pragma comment(lib, "FreeImaged.lib")
#else
#pragma comment(lib, "FreeImage.lib")
#endif
默认情况下,FreeImage 被当作动态链接库。若需用作静态链接库,则在应用程序类的InitInstance 中调用FreeImage_Initialise(0) 加载FreeImage 库,重载ExitInstance 并在其中调用FreeImage_DeInitialise() 释放FreeImage 库。
三、读取图像
FreeImage 是插件驱动的,每种位图的读写函数实际上就是一个插件模块。采用插件驱动型构架便于功能扩展,通过创建或引入新的插件,可以支持新的图像类型。为便于维护打开的位图,在文档类添加FIBITMAP 型指针m_pFI ,用以指向打开的位图。在构造函数中将其置为空,在析构函数中调用FreeDIB 将其释放。FreeDIB 定义如下:
void CDIPDoc:: FreeDIB ()
{
if(m_pFI) {
FreeImage_Unload(m_pFI);// 释放位图
m_pFI = NULL;
}
}
在OnNewDocument() 和OnFileOpen() 函数中也应调用FreeDIB ,以确保建立或打开新图像时先释放以前的位图。
读取图像的基本步骤如下:
调用库函数FreeImage_GetFileType 由文件头分析文件类型,若不能识别,则调用库函数FreeImage_GetFIFFromFilename 从文件扩展名判断文件类型。
若是支持的图像文件类型,则调用库函数FreeImage_FIFSupportsReading 判断是否支持该位图类型的读操作,若支持则调用库函数FreeImage_Load 加载位图。
在文档类中添加成员函数LoadDIB ,实现位图读入功能,代码如下:
FIBITMAP* CDIPDoc::LoadDIB(LPCTSTR lpszPathName, int flag){
FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
fif = FreeImage_GetFileType(lpszPathName);
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;
}
在文档类中重载OnFileOpen ,调用GetFilterString 创建文件类型过滤字符串,调用LoadDIB 加载位图。
void CDIPDoc::OnFileOpen()
{
FIBITMAP* pFI = NULL;
char szFilter[2048];
GetFilterString(szFilter);
CFileDialog dlg(TRUE,NULL,NULL,
OFN_HIDEREADONLY, szFilter);
if(dlg.DoModal() == IDOK)
{
CString strPath = dlg.GetPathName();
pFI = LoadDIB(strPath, 0);
if(pFI)
{
FreeDIB();// 释放以前的位图
m_pFI = pFI;// 指向新位图
UpdateAllViews (NULL);
}
}
}
四、显示图像
在视图类的OnDraw 函数中绘制图像。当前源图像与客户区尺寸相同时,调用SetDIBitsToDevice 绘制,这样可以加快绘制速度,否则调用StretchDIBits 按比例缩放位图。
void CDIPView::OnDraw(CDC* pDC)
{
CDIPDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
FIBITMAP *pFI = pDoc->m_pFI;
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);
}
}
}
五、保存图像
(1 )调用FreeImage_GetFIFFromFilename 函数从文件名判断期望保存的图像类型,如果不支持则返回;否则转(2 )。
(2 )调用FreeImage_GetImageType 判断当前位图数据类型,若为标准位图,则测试是否支持该种图像类型的写操作以及位深度转换,否则调用FreeImage_FIFSupportsExportType 检查是否能够输出当前位图。若测试成功,则调用FreeImage_Save 保存位图。
在文档类中定义成员函数SaveDIB 实现上述功能,代码如下:
BOOL CDIPDOC::SaveDIB(FIBITMAP *dib, LPCTSTR *lpszPath, int flag){
FREE_IMAGE_FORMAT fif =FIF_UNKNOWN;
BOOL bSuccess = FALSE;
fif=FreeImage_GetFIFFromFilename(lpszPath);
if(fif != FIF_UNKNOWN )
{
BOOL bCanSave;
FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib);
if(image_type == FIT_BITMAP)
{
WORD bpp = FreeImage_GetBPP(dib);
bCanSave=(FreeImage_FIFSupportsWriting(fif) && FreeImage_FIFSupportsExportBPP(fif, bpp));
}
else
{
bCanSave=FreeImage_FIFSupportsExportType(fif, image_type);
}
if(bCanSave) bSuccess=
FreeImage_Save(fif,dib,lpszPath,flag);
}
return bSuccess;
}
六、一个简单的程序实例
#i nclude <iostream>
#i nclude <cassert>
#i nclude"FreeImage.h"
#pragma comment(lib,"FreeImage.lib")
#define show(a) std::cout<< a <<std::endl
int main(int argc,char *argv)
{
//初始化FreeImage
FreeImage_Initialise(TRUE);
//默认分配一块内存存储影像,其中bpp表示图像深度
//FIBITMAP *bitmap = FreeImage_AllocateT(FIT_BITMAP,Width,height,bpp,
//red_mask,green_mask,blue_mask);
//最后一个参数用来改变函数的行为或激活位图插件的一种特性,每个插件有他自己的参数集
//FreeImage_LoadU参数都是一样,不过只在win32下起作用
FIBITMAP * bmp = FreeImage_Load(FIF_BMP,"cs5.BMP",BMP_DEFAULT);
//FreeImage_SaveU和上面的一样
if( bmp)
{
//FreeImage_Save(FIF_BMP, bmp, "whtm.bmp", BMP_DEFAULT);
}
//获取影像的宽高,都以像素为单位
int Width = FreeImage_GetWidth(bmp);
int Height = FreeImage_GetHeight(bmp);
//获取影像的byte宽度,不对,我上面运行与Width相等
int ByteWidth = FreeImage_GetLine(bmp);
//返回每个像素使用灰度值
show(FreeImage_GetBPP(bmp));
//返回数据类型
show(FreeImage_GetImageType(bmp));
//返回调色板的大小
show(FreeImage_GetColorsUsed(bmp));
show(Width<<" "<<Height<<" "<<ByteWidth);
//assert(ByteWidth == Width*8 );
show(FreeImage_GetDIBSize(bmp));
//有调用load就有unload,否则就会内存泄漏
FreeImage_Unload(bmp);
FreeImage_DeInitialise();
return 0;
}
转载于梅园 《FreeImage学习笔记》 http://blog.chinaunix.net/u1/58776/showart_527523.html
参考资料:
源代码:http://freeimage.sourceforge.net/
FreeImage图形库说明文档(中文版):http://download.csdn.net/source/2756601
FreeImage使用方法相关推荐
- 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群
作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...
- Java面试题大全2021版
一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...
- C#编程-FreeImage.dll使用方法
最近用到这个FreeImage.DLL,之前只是在C++里面调用,现在需要在C#里调用,于是学习了一点点,总结一下: 在FreeImage中,要用到几个参数,在C#中定义如下: private enu ...
- OGRE 1.7.2 [Cthugha] 编译配置全过程方法
最近老师说让我们学习一下OGRE场景编辑器,网上搜索了很久,最后搜索到了Ogitor学做编辑器的方法,前提是要先编译好OGRE,于是,我就开始看网上的各种资料来学习OGRE,由于没人给予指导,都是自己 ...
- OpenCV常见的优化方法和技巧总结
OpenCV常见的优化方法和技巧总结 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/78540206 目录 OpenCV常 ...
- linux系统下替换图片,Linux(ubuntu系统)下使用FreeImage库
Linux(ubuntu系统)下使用FreeImage库 Linux(ubuntu系统)下使用FreeImage库 最近在搞一个图像处理的项目,需要用到FreeImage,之前在Windows下用过, ...
- 使用FreeImage加载纹理
DirectX9中提供了函数D3DXCreateTexureFromFile函数,但是对用户是透明的,不知道其实现,并且在实际当中一般都是用多线程来进行资源的处理,就像自己实现一下 考虑了两种方法来适 ...
- php 防止不登录进入后台,php后台如何避免用户直接进入方法实例
这篇文章介绍了php后台如何避免用户直接进入方法实例,有需要的朋友可以参考一下 1)创建BaseController控制器继承Controller(后台的一切操作要继承BaseController): ...
- moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解
☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>和<moviepy音视频剪辑:moviepy中的剪辑基类Cl ...
- FreeImage的图像处理软件
(来源:http://www.comprg.com.cn/detail.asp?hw_id=7843 ) 一.引言 图 像处理与分析软件都涉及到图像文件的读写与绘制,以及位图信息的获取与设置等基本操作 ...
最新文章
- gdoi2017总结
- 安卓APP_ 布局(1)—— LinearLayout
- EFCore3.1+编写自定义的EF.Functions扩展方法
- mysql 8.0用doc修改密码_MYSQL8.0修改密码流程
- HTTP Error 415: Unsupported Media Type! 这个错误
- OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
- 男人到了中年,还是没钱没人脉,就越要有这3种心理,总会有出息
- Oracle DB 优化-AWR及相关内容
- Servlet chapter 2
- 【136天】尚学堂高淇Java300集视频精华笔记(77-78)
- 开发完微信小程序后,怎样做好微信小程序运营?
- 【18年北京网络赛】Tomb Raider【递归求所有子序列】
- 汽车领域多语种迁移学习挑战赛-Coggle 30 Days of ML
- Python连锁药店营业额数据分析实验
- 打电话流程(打电话时,从拨出电话到接听电话的几秒经历了什么)
- validation校验 @NotNull @NotBlank及分组校验
- 《论语》原文及其全文翻译 学而篇2
- FANUC数控机床的维修 从原理开始(二)
- eNSP华为模拟器使用——(1)虚拟环境配置
- 查看笔记本电池健康度的两种方法和电池报告解析