|
前言 四大圖像庫(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 ...
|
|