1.FreeImage的圖像加載
FreeImage 是插件驅動的,每種位圖的讀寫函數實際上就是一個插件子產品。采用插件驅動型構架便于功能擴充,通過建立或引入新的插件,可以支援新的圖像類型。為便于維護打開的位圖,在文檔類添加FIBITMAP 型指針m_pFI ,用以指向打開的位圖。在構造函數中将其置為空,在析構函數中調用FreeDIB 将其釋放。
2.圖像加載步驟
(1).加載圖像
調用庫函數FreeImage_GetFileType 由檔案頭分析檔案類型,若不能識别,則調用庫函FreeImage_GetFIFFromFilename 從檔案擴充名判斷檔案類型。若是支援的圖像檔案類型,則調用庫FreeImage_FIFSupportsReading 判斷是否支援該位圖類型的讀操作,若支援則調用庫函數FreeImage_Load 加載位圖。
在文檔類中添加成員函數LoadDIB,實作位圖讀入功能,代碼如下:
FIBITMAP* CDIPDoc::LoadDIB(LPCTSTR lpszPathName, int flag){
FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
fif = FreeImage_GetFileType(lpszPathName);
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;
}
(2).顯示圖像
FIBITMAP *pFI = pDoc->m_pFI;
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);
}
}
(3).儲存圖像
調用FreeImage_GetFIFFromFilename 函數從檔案名判斷期望儲存的圖像類型,如果不支援則傳回;否則調FreeImage_GetImageType 判斷目前位圖資料類型,若為标準位圖,則測試是否支援該種圖像類型的寫操作以及位深度轉換,否則調用FreeImage_FIFSupportsExportType 檢查是否能夠輸出目前位圖。若測試成功,則調用FreeImage_Save 儲存位圖。
FREE_IMAGE_FORMAT fif =FIF_UNKNOWN;
BOOL bSuccess = FALSE;
fif=FreeImage_GetFIFFromFilename(lpszPath);
if(fif != FIF_UNKNOWN )
{
BOOL bCanSave;
FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib);
if(image_type == FIT_BITMAP)
{
WORD bpp = FreeImage_GetBPP(dib);
bCanSave=(FreeImage_FIFSupportsWriting(fif) && FreeImage_FIFSupportsExportBPP(fif, bpp));
}
else
{
bCanSave=FreeImage_FIFSupportsExportType(fif, image_type);
}
if(bCanSave) bSuccess=
FreeImage_Save(fif,dib,lpszPath,flag);
}