找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 10216|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

FreeImage使用方法&FreeImage Tutorial

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:77367 發(fā)表于 2015-4-18 21:19 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
前言 四大圖像庫(kù):OpenCV: 功能十分的強(qiáng)大,而且支持目前先進(jìn)的圖像處理技術(shù),體系十分完善,操作手冊(cè)很詳細(xì),手冊(cè)首先給大家補(bǔ)計(jì)算機(jī)視覺(jué)的知識(shí),幾乎涵蓋了近10年內(nèi)的主流算法;
http://sourceforge.net/projects/opencvlibrary/
FreeImage :非常好用的開(kāi)源圖像庫(kù),支持二十多種類型的圖像和多種圖像處理功能。只需一個(gè)頭文件、一個(gè)靜態(tài)庫(kù)、一個(gè)動(dòng)態(tài)鏈接庫(kù)即可。目前還不支持矢量圖。C語(yǔ)言的體系,大量使用指針運(yùn)算速度可以保證,內(nèi)含先進(jìn)的多種插值算法。
http://freeimage.sourceforge.net/
CImg :就一個(gè).h文件所以用起來(lái)很簡(jiǎn)明,但感覺(jué)功能上不如CxImage。
可以與CxImage配合使用,因?yàn)镃Img提供了基于lapack的矩陣運(yùn)算函數(shù)和完善的線性濾波卷積函數(shù),同時(shí)CImg做像素運(yùn)算還是很方便的。
http://cimg.sourceforge.net/
CxImage:有一個(gè)界面很強(qiáng)的demo程序,
http://www.xdp.it/cximage.htm




FreeImage使用方法


FreeImage支持20 多種圖像類型的(如BMP 、JPEG 、GIF PNG 、TIFF 等)圖像處理庫(kù)。如下圖FreeImage允許的位圖格式:
            

FreeImage的使用例子好像很少,這里以Visual Studio 2008+SP1為例說(shuō)明怎么使用FreeImage圖形庫(kù)。
FreeImage下載是在http://freeimage.sourceforge.net/ ,解壓縮后里面有個(gè)Dist的文件夾,這里面的五個(gè)文件就是我們用FreeImage所需要的全部東東了,即FreeImage.lib、FreeImage.dll、FreeImaged.lib、FreeImaged.dll、FreeImage.h,以d 結(jié)尾的庫(kù)文件用于Debug版本,沒(méi)有的用于Release版本的。

一、新建一個(gè)名稱為FITest的MFC單文檔應(yīng)用程序,將FreeImage中的Dist文件夾添加到“工具->選項(xiàng)->項(xiàng)目和解決方案->VC++目錄”中的“包含文件”與“庫(kù)文件”中;


二、初始化

(1)、在stdafx.h 文件中加入如下代碼:
#include"FreeImage.h"#ifdef _DEBUG#pragma comment(lib, "FreeImaged.lib")#else#pragma comment(lib, "FreeImage.lib")#endif(2)、例外默認(rèn)情況下,F(xiàn)reeImage 被當(dāng)作動(dòng)態(tài)鏈接庫(kù)。若需用作靜態(tài)鏈接庫(kù),則在應(yīng)用程序類的InitInstance 中調(diào)用FreeImage_Initialise(0) 來(lái)初始化FreeImage庫(kù)。
(3)、重載ExitInstance 并在其中調(diào)用FreeImage_DeInitialise()釋放FreeImage 庫(kù)。這個(gè)必須在程序的結(jié)尾處唯一地一次調(diào)用該函數(shù),以清除FreeImage庫(kù)在內(nèi)存中分配的內(nèi)存,不然會(huì)造成很嚴(yán)重的內(nèi)存泄露。

int CFITestApp::ExitInstance()
{
// TODO: 在此添加專用代碼和/或調(diào)用基類
FreeImage_DeInitialise();
return CWinAppEx::ExitInstance();
}



三、讀取圖像
(1)、給CFITestDoc類添加一個(gè)public變量
FIBITMAP *m_handleFI;
在類的構(gòu)造函數(shù)添加 :m_handleFI(NULL) 字樣,即


CFITestDoc::CFITestDoc():m_handleFI(NULL)
{
// TODO: 在此添加一次性構(gòu)造代碼


}



(2)、給CFITestDoc類添加兩個(gè)函數(shù),FreeDIB ()和LoadDIB(LPCTSTR lpszPathName, int flag)
函數(shù)代碼如下
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)、在析構(gòu)函數(shù)中釋放位圖
CFITestDoc::~CFITestDoc()
{
    FreeDIB();
}

(4)、為CFITestDoc類添加ID_FILE_OPEN的COMMAND事件響應(yīng)函數(shù)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()函數(shù)添加代碼
void CFITestView::OnDraw(CDC* pDC)   //記得去掉注釋掉的pDC
{
CFITestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

// TODO: 在此處為本機(jī)數(shù)據(jù)添加繪制代碼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);
}
}
}



五、調(diào)試程序
調(diào)試程序要注意了,可能在LoadDIB函數(shù)中出現(xiàn)錯(cuò)誤,提示LPCTSTR不能轉(zhuǎn)換成const char * ,本來(lái)在ANSI下兩者是一樣的,設(shè)置一下項(xiàng)目屬性。


按Alt+F7快捷鍵,如下圖,設(shè)置字符集為【使用多字節(jié)字符集】
                     


記得把FreeImaged.dll拷貝到...\FITest\Debug下,F(xiàn)reeImage.dll拷貝到...\FITest\Release目錄下;蚨伎截惖紺:\WINDOWS\system32\下也行。




按Ctrl+F5運(yùn)行程序。


                                       



點(diǎn)擊 【文件】->【打開(kāi)】打開(kāi)一張圖片。。。。。。。


                 

                                         
                                
            

參考資料:源代碼: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 ...

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表