天天看點

FreeImage的學習總結總結(二)

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);

}
           

繼續閱讀