BMP、JPG、GIF圖像的顯示

     用VB的picture控件顯示BMP、JPG、GIF很方便,但是在VC、MFC下卻不能直接顯示,於是我參考網上的例子寫了一個圖片顯示函數,希望能方便大家的使用。
    Windows提供了一個顯示BMP、JPG、GIF的標準方法,你只需要實例化IPicture以及它的調用就可以,通過OleLoadPicture函數函數從流中讀取圖片並創建該圖片的IPicture對象:
  OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);
它在MSDN裏的定義如下:
STDAPI OleLoadPicture(
  IStream * pStream,
               //Pointer to the stream that contains picture's data
  LONG lSize,  //Number of bytes read from the stream
  BOOL fRunmode,
               //The opposite of the initial value of the picture's
               // property
  REFIID riid, //Reference to the identifier of the interface
               // describing the type of interface pointer to return
  VOID ppvObj  //Address of output variable that receives interface
               // pointer requested in riid
);

以下是顯示我在對話框CNewFormDlg中的一個圖像顯示函數DisplayPic,使用它可以在一個控件上顯示一幅圖片,該函數可以顯示BMP、JPG和GIF文件,參數如下:
char *lpImageFile 圖像文件名
HWND hWnd  要顯視對象句柄
int nScrWidth  顯示寬度
int nScrHeight  顯示高度

HRESULT CNewFormDlg::DisplayPic(char *lpImageFile, HWND hWnd, int nScrWidth, int nScrHeight)
{
    HDC hDC_Temp=::GetDC(hWnd);

    IPicture *pPic;
    IStream *pStm;

    BOOL bResult;

    HANDLE hFile=NULL;
    DWORD dwFileSize,dwByteRead;

    //打開硬盤中的圖形文件
    hFile=CreateFile(lpstrFile,GENERIC_READ,
    FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

    if (hFile!=INVALID_HANDLE_VALUE)
    {
        dwFileSize=GetFileSize(hFile,NULL);//獲取文件字節數

        if (dwFileSize==0xFFFFFFFF)
            return E_FAIL;
    }
    else
    {
        return E_FAIL;
    }

    //分配全局存儲空間
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
    LPVOID pvData = NULL;

    if (hGlobal == NULL)
    {
        AfxMessageBox("圖形文件分配出錯.");
        return E_FAIL;
    }

    if ((pvData = GlobalLock(hGlobal)) == NULL)//鎖定分配內存塊
    {
        AfxMessageBox("內存塊鎖定出問題");
        return E_FAIL;
    }

    ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件讀入內存緩衝區

    GlobalUnlock(hGlobal);

    if(CreateStreamOnHGlobal(hGlobal, TRUE, &pStm) != S_OK)
    {
        AfxMessageBox("流初始化失敗");
        return E_FAIL;
    }

    //裝入圖形文件
    bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);

    if(FAILED(bResult))
    {
        AfxMessageBox("圖形文件裝載出錯.");
        return E_FAIL;
    }

    OLE_XSIZE_HIMETRIC hmWidth;//圖片的真實寬度
    OLE_YSIZE_HIMETRIC hmHeight;//圖片的真實高度
    pPic->get_Width(&hmWidth);
    pPic->get_Height(&hmHeight);

    //將圖形輸出到屏幕上
    bResult=pPic->Render(hDC_Temp,0,0,nScrWidth,nScrHeight,
    0,hmHeight,hmWidth,-hmHeight,NULL);

    CloseHandle(hFile);//關閉打開的文件
   
    pPic->Release();
    // Free memory.
    GlobalFree(hGlobal);

    if (SUCCEEDED(bResult))
    {
        return S_OK;
    }
    else
    {
        AfxMessageBox("圖形文件裝載出錯.");
        return E_FAIL;
    }
}
調用如下:
void CNewFormDlg::OnButton2()
{
 HWND m_hWnd;
 GetDlgItem(IDC_STATIC_VIEW,&m_hWnd);
 DisplayPic("F://圖片//水晶//Crystal521.jpg",m_hWnd,500,500);
}

發佈了31 篇原創文章 · 獲贊 0 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章