|
前言 四大圖像庫: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允許的位圖格式:

FreeImage的使用例子好像很少,這里以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快捷鍵,如下圖,設置字符集為【使用多字節字符集】

記得把FreeImaged.dll拷貝到...\FITest\Debug下,FreeImage.dll拷貝到...\FITest\Release目錄下;蚨伎截惖紺:\WINDOWS\system32\下也行。
按Ctrl+F5運行程序。

點擊 【文件】->【打開】打開一張圖片。。。。。。。


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