FreeImage通用文件加载与转换器

这篇博客介绍了如何利用FreeImage库加载图像并将其转换为常用格式,如bmp、jpeg和tiff。通过在视类中定义FIBITMAP* dib作为成员变量,并在构造函数初始化,然后在析构函数中释放内存。在"另存为"菜单中添加命令响应函数,实现了图像的便捷转换。此外,还提到了使用FreeImage提供的例程进行图像保存的简化方法。
摘要由CSDN通过智能技术生成

           在上篇中我谈到FreeImage可以用于通用图像的加载与显示,这里继续下面的操作,将上面载入的图像转换成比较常用的格式,FreeImage提供了常用的bmp,jpeg,tiff等格式,稍微修改一下上一篇中的代码,将上一篇中OnDraw定义的局部变量FIBITMAP* dib;转而定义成视类的成员变量。

在构造函数中设置  :dib = 0;这样FreeImage_Unload(dib)的操作就不应该在OnDraw函数中调用,而应在析构函数中调用。

以上设置完成后,在菜单栏:另存为……,添加命令响应函数,添加如下代码:
 

void CGenricImageTransformerView::OnFileSaveAs() 
{
	// TODO: Add your command handler code here
	CFileDialog fileDlg(FALSE,".bmp","img.*",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
						"Bmp(*.bmp)|*.bmp|Jpg(*.jpg)|*.jpg|/
						Tif(*.tif)|*.tif|Any(*.*)|*.*||",
						NULL);
	if(IDOK == fileDlg.DoModal())
	{
		CString strFileExt = fileDlg.GetFileExt();
//		strFileExt.MakeLower();
		CString filename = fileDlg.GetFileName();
		FREE_IMAGE_FORMAT fif;
		int nType;
		if(!strFileExt.Compare("bmp"))
			nType = 1;
		if(!strFileExt.Compare("jpg"))
			nType = 2;
		if (!strFileExt.Compare("tif"))
			nType = 3;
		switch(nType)
		{
		case 1:
			fif = FIF_BMP;
			break;
		case 2:
			fif = FIF_JPEG;
			break;
		case 3:
			fif = FIF_TIFF;
			break;
		default:
			fif = FIF_UNKNOWN;		
		}
		FreeImage_Save(fif,dib,filename,0);
	}
}

这样你的程序就可以很容易的载入图像,并将其转换为常用的格式了。

或者:利用FreeImage中给出的一个例程,利用图像保存函数:

BOOL CGenricImageTransformerView::GenericWriter(FIBITMAP *dib, const char *filename)
{
	FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
	BOOL bSuccess = FALSE;
	fif = FreeImage_GetFIFFromFilename(filename);
	if(fif != FIF_UNKNOWN)
	{
		BOOL bCanSave;
		FREE_IMAGE_TYPE imgType = FreeImage_GetImageType(dib);
		if(imgType == FIT_BITMAP)
		{
			WORD bpp = FreeImage_GetBPP(dib);
			bCanSave = (FreeImage_FIFSupportsWriting(fif)
				&& FreeImage_FIFSupportsExportBPP(fif,bpp));
		}
		else
		{
			bCanSave = FreeImage_FIFSupportsExportType(fif,imgType);
		}
		
		if(bCanSave)
		{
			bSuccess = FreeImage_Save(fif,dib,filename);
		}
	}
	return bSuccess;
}

再调用上面的函数,思路要清晰很多:

void CGenricImageTransformerView::OnFileSaveAs() 
{
	// TODO: Add your command handler code here
	CFileDialog fileDlg(FALSE,".bmp","img.*",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
	"bmp(*.bmp)|*.bmp|jpg(*.jpg)|*.jpg|/
	tif(*.tif)|*.tif|png(*.png)|*.png|/
	Any(*.*)|*.*||",
	NULL);
	
	if(IDOK == fileDlg.DoModal())
	{
		CString filename = fileDlg.GetFileName();
		BOOL bSuccess =	GenericWriter(dib,filename);
		if(!bSuccess)
			MessageBox("Not support that type!");
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值