久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: FreeImage使用方法&FreeImage Tutorial [打印本頁(yè)]

作者: bibi    時(shí)間: 2015-4-18 21:19
標(biāo)題: FreeImage使用方法&FreeImage Tutorial
前言 四大圖像庫(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目錄下。或都拷貝到C:\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 ...






歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产小视频在线播放 | 一级毛片大全 | 欧洲av在线| www.天天操 | 四虎影院在线播放 | 一区二区三区在线播放 | 一级毛片在线看 | 免费一级a毛片 | 久久天天躁狠狠躁夜夜躁2014 | 在线观看日韩欧美 | 欧美日韩精品一区二区 | 一区在线观看视频 | 天天色小说 | 可以免费看的av | 成人免费看 | 日韩av导航| wwwxxx欧美 | 日日狠狠 | 国产欧美日韩在线 | 97精品在线视频 | 久久精品久久久 | www.av在线播放 | 国产精品视频99 | 国产精品综合 | 夜夜草导航 | 亚洲免费二区 | 四虎1515| 夜夜操天天 | 九九热在线播放 | 久久久三级 | 精品少妇v888av | 在线播放h | 91亚洲视频| 一区二区三区精品 | 国产三级在线观看视频 | 亚洲最大黄色网址 | 一区二区欧美日韩 | 国产精品久久久久久无人区 | 国产日韩欧美亚洲 | 一区二区自拍 | 99热在线观看 |