<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    IPicture總結

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    1、利用IPicture接口加載、顯示圖片

    IPicture接口管理一個圖片對象和它的屬性。圖片對象提供對Bitmap Icon Metafile的語言不相關的抽象支持。圖像對象的主要接口是IPicture和IPictureDisp。IPictureDisp從IDispatch繼承,提供了通過自動化訪問圖片屬性的能力。圖片對象可通過OleCreatePictureIndirect創建。關于IPicture支持的其他接口和方法可以看MSDN,一般創建圖片對象可以用OleLoadPicture函數,它簡化了基于流內容創建圖片對象。

    IPicture接口管理一個圖片對象和它的屬性。圖片對象提供對Bitmap Icon Metafile的語言不相關的抽象支持。圖像對象的主要接口是IPicture和IPictureDisp。IPictureDisp從IDispatch繼承,提供了通過自動化訪問圖片屬性的能力。圖片對象可通過OleCreatePictureIndirect創建。關于IPicture支持的其他接口和方法可以看MSDN,一般創建圖片對象可以用OleLoadPicture函數,它簡化了基于流內容創建圖片對象。下面的代碼中有兩個未定義的變量是FilePath和hDC。 
    //FilePath是從外部傳入的圖片路徑 
    //打開文件 
    HANDLE hFile = CreateFile(FilePath, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); 
    _ASSERTE(INVALID_HANDLE_VALUE != hFile); 
    //取文件大小 
    DWORD dwFileSize = GetFileSize(hFile, NULL); 
    _ASSERTE(-1 != dwFileSize); 
    LPVOID pvData = NULL; 
    //分配內存,準備讀入圖片文件的數據 
    //GlobalAlloc從堆分配指定字節的內存區域 
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize); 
    _ASSERTE(NULL != hGlobal); 
    //GlobalLock函數鎖住一個全局的內存對象同時返回一個指向對象首字節的指針 
    pvData = GlobalLock(hGlobal); 
    _ASSERTE(NULL != pvData); 
    DWORD dwBytesRead = 0; 
    //讀取文件的數據到分配的全局內存 
    BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL); 
    _ASSERTE(FALSE != bRead); 
    GlobalUnlock(hGlobal); 
    CloseHandle(hFile);

    //到此,我們已經把文件的數據讀到了內存當中

    LPSTREAM pstm = NULL; 
    //從全局內存創建IStream接口指針 
    HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm); 
    _ASSERTE(SUCCEEDED(hr) && pstm); 
    //根據圖片文件創建IPicture接口指針 
    hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture); 
    _ASSERTE(SUCCEEDED(hr) && gpPicture); 
    pstm->Release();

    //至此,IPicture接口建立好,下面開始畫圖片 
    //hDC是外部傳入的畫圖設備 
    long hmWidth; 
    long hmHeight; 
    gpPicture->get_Width(&hmWidth); 
    gpPicture->get_Height(&hmHeight); 
    //轉換himetric距離為pixels距離,1英寸=25.4毫米 
    int nWidth = MulDiv(hmWidth, GetDeviceCaps(hDC, LOGPIXELSX), 2540); 
    int nHeight = MulDiv(hmHeight, GetDeviceCaps(hDC, LOGPIXELSY), 2540); 
    RECT rc; 
    GetClientRect(hWnd, &rc); 
    //IPicture::Render顯示圖片 
    gpPicture->Render(hDC, 0, 0, nWidth, nHeight, 0, hmHeight, hmWidth, -hmHeight, &rc);

    2、C++如何調用圖片 
    有很多辦法 ,比如用IPicture,用CBitmap //MFC,更直接的是,用File進行文件操作,用BitBlt顯示,具體代碼你用以上關鍵字Google下 
    這里給你推薦幾個,末尾給你附一個網上可以找到的CPicture類(需MFC支持): 
    ——-IPicture 
    // pDoc為文檔對象指針 
    // pDC為設備描述表指針 
    ::CoInitialize(NULL); // COM 初始化 
    HRESULT hr; 
    CFile file; 
    file.Open(pDoc->GetPathName(), CFile::modeRead | CFile::shareDenyNone ); // 讀入文件內容 
    DWORD dwSize = file.GetLength(); 
    HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize ); 
    LPVOID lpBuf = ::GlobalLock( hMem ); 
    file.ReadHuge( lpBuf, dwSize ); 
    file.Close(); 
    ::GlobalUnlock( hMem ); 
    IStream * pStream = NULL; 
    IPicture * pPicture = NULL; 
    // 由 HGLOBAL 得到 IStream,參數 TRUE 表示釋放 IStream 的同時,釋放內存 
    hr = ::CreateStreamOnHGlobal( hMem, TRUE, &pStream ); 
    ASSERT ( SUCCEEDED(hr) ); 
    hr = ::OleLoadPicture( pStream, dwSize, TRUE, IID_IPicture, ( LPVOID * )&pPicture ); 
    ASSERT(hr==S_OK); 
    long nWidth,nHeight; // 寬高,MM_HIMETRIC 模式,單位是0.01毫米 
    pPicture->get_Width( &nWidth ); // 寬 
    pPicture->get_Height( &nHeight ); // 高 
    CRect rect; 
    GetClientRect(&rect); 
    CSize sz( nWidth, nHeight ); 
    pDC->HIMETRICtoDP( &sz ); // 轉換 MM_HIMETRIC 模式單位為 MM_TEXT 像素單位 
    long x, y, cx, cy; 
    // 原始大小 
    /* 
    cx = sz.cx; 
    cy = sz.cy; 
    x = rect.Width() / 2 – cx / 2; 
    y = rect.Height() / 2 – cy / 2; 
    */ 
    // 自動適應窗口 
    double fRatePic, fRateWnd; 
    fRatePic = (double)sz.cx / (double)sz.cy; 
    fRateWnd = (double)rect.Width() / (double)rect.Height(); 
    if (fRatePic > fRateWnd) 
    { 
    cx = rect.Width(); 
    cy = (long)(rect.Width() / fRatePic); 
    } 
    else 
    { 
    cx = (long)(rect.Height() * fRatePic); 
    cy = rect.Height(); 
    } 
    if (cx == rect.Width()) 
    { 
    x = 0; 
    y = rect.Height() / 2 – cy / 2; 
    } 
    if (cy == rect.Height()) 
    { 
    x = rect.Width() / 2 – cx / 2; 
    y = 0; 
    } 
    pPicture->Render(pDC->m_hDC, x, y, cx, cy, 
    0, nHeight, nWidth, -nHeight, NULL); 
    if ( pPicture ) pPicture->Release();// 釋放 IPicture 指針 
    if ( pStream ) pStream->Release(); // 釋放 IStream 指針,同時釋放了 hMem 
    ::CoUninitialize(); 
    ——————————–CBitmap: 
    HBITMAP bitmap; 
    bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),strFileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    m_backBitmap.DeleteObject(); 
    if(!m_backBitmap.Attach(bitmap)) 
    { 
    MessageBox("導入背景圖失敗!","提示",MB_OK); 
    return; 
    } 
    ———————-File:略 
    前提是你要知道圖片的編碼格式 
    一般比較簡單的是BMP,包括 
    BITMAPFILEHEADER,BITMAPINFO,BITMAPINFOHEADER 
    如果圖片采用了壓縮算法可能會麻煩一點, 
    關于詳細情況你也以Google一下 
    附CPicture(引用自網上) 
    // Picture.h: interface for the CPicture 
    #ifndef PICTURE_H 
    #ifndef picture_h 
    #define PICTURE_H 
    #define picture_h 
    #if _MSC_VER > 1000 
    #pragma once 
    #endif // _MSC_VER > 1000 
    class CPicture 
    { 
    public: 
    CPicture(); 
    virtual ~CPicture(); 
    public: 
    BOOL LoadPicture(UINT nResource, LPCTSTR lpszResType) 
    {return LoadPicture(MAKEINTRESOURCE(nResource), lpszResType);} 
    BOOL LoadPictureFromFile(LPCTSTR lpszFileName); 
    BOOL LoadPicture(LPCTSTR lpszResource,LPCTSTR lpszResType); 
    BOOL IsValid(){ return m_pPic!=NULL;} 
    CSize GetSize(){return m_size;} 
    void Draw(CDC* pDC, LPCRECT lprcDest, LPCRECT lprcSrc); 
    void Draw(CDC* pDC, int xDest,int yDest, int cxDest, int cyDest , 
    int xSrc ,int ySrc ,int cxSrc ,int cySrc); 
    void Release(); 
    protected: 
    IPicture* m_pPic; 
    OLE_XSIZE_HIMETRIC _w_him; 
    OLE_YSIZE_HIMETRIC _h_him; 
    CSize m_size; 
    protected: 
    void CalcSize(); 
    }; 
    #endif // define picture_h 
    #endif // define PICTURE_H 
    ////////////////////////////////////////////////////////////////////// 
    // Picture.cpp: implementation of the CPicture class. 
    // Lounge Stdio 2003 
    // 作者:邊城浪子(QQ:16168666) 
    // E-mail: krh2001.lpfdiyvbb@163.com 
    ////////////////////////////////////////////////////////////////////// 
    #include "stdafx.h" 
    #include "Picture.h" 
    #ifdef _DEBUG 
    #undef THIS_FILE 
    static char THIS_FILE[]=__FILE__; 
    #define new DEBUG_NEW 
    #endif 
    ////////////////////////////////////////////////////////////////////// 
    // Construction/Destruction 
    ////////////////////////////////////////////////////////////////////// 
    CPicture::CPicture() 
    :m_pPic(NULL), _h_him(0), _w_him(0), m_size(0,0) 
    { 
    } 
    CPicture::~CPicture() 
    { 
    Release(); 
    } 
    void CPicture::Release() 
    { 
    if(m_pPic != NULL) 
    { 
    m_pPic->Release(); 
    m_pPic = NULL; 
    _h_him = _w_him = 0; 
    m_size.cx = m_size.cy = 0; 
    } 
    } 
    BOOL CPicture::LoadPicture(LPCTSTR lpszResource, LPCTSTR lpszResType) 
    { 
    Release(); 
    HINSTANCE hInst = AfxFindResourceHandle(lpszResource, lpszResType); 
    HRSRC hRsrc = ::FindResource(hInst, lpszResource, lpszResType); 
    if(hRsrc == NULL) return FALSE; 
    HGLOBAL hGlobal = LoadResource(hInst, hRsrc); 
    if(hGlobal == NULL) return FALSE; 
    DWORD dwSize = SizeofResource(hInst, hRsrc); 
    HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, dwSize); 
    if(hMem == NULL) return FALSE; 
    LPVOID pSrc = ::LockResource(hGlobal); 
    if(pSrc == NULL) { 
    ::GlobalFree(hMem); 
    return FALSE; 
    } 
    LPVOID pDes = ::GlobalLock(hMem); 
    if(pDes == NULL){ 
    //::GlobalUnlock(hGlobal); 
    ::GlobalFree(hMem); 
    return FALSE; 
    } 
    memcpy(pDes, pSrc, dwSize); 
    //GlobalUnlock(hGlobal); 
    GlobalUnlock(hMem); 
    ::FreeResource(hGlobal); 
    IStream* pStm = NULL; 
    CreateStreamOnHGlobal(hMem, TRUE, &pStm); 
    if(!SUCCEEDED(OleLoadPicture(pStm,dwSize,TRUE,IID_IPicture,(LPVOID*)&m_pPic))) 
    { 
    pStm -> Release(); 
    ::GlobalFree(hMem); 
    pStm = NULL; 
    return FALSE; 
    } 
    pStm->Release(); 
    ::GlobalFree(hMem); 
    CalcSize(); 
    return TRUE; 
    } 
    BOOL CPicture::LoadPictureFromFile(LPCTSTR lpszFileName) 
    { 
    Release(); 
    CFile file; 
    if(!file.Open(lpszFileName, CFile::modeRead)) 
    return FALSE; 
    DWORD dwSize = file.GetLength(); 
    HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, dwSize); 
    if(hMem == NULL) return FALSE; 
    LPVOID pDes = ::GlobalLock(hMem); 
    if(pDes == NULL){ 
    ::GlobalFree(hMem); 
    return FALSE; 
    } 
    file.ReadHuge(pDes, dwSize); 
    file.Close(); 
    GlobalUnlock(hMem); 
    IStream* pStm = NULL; 
    CreateStreamOnHGlobal(hMem, TRUE, &pStm); 
    if(!SUCCEEDED(OleLoadPicture(pStm,dwSize,TRUE,IID_IPicture,(LPVOID*)&m_pPic))) 
    { 
    pStm -> Release(); 
    ::GlobalFree(hMem); 
    pStm = NULL; 
    return FALSE; 
    } 
    pStm->Release(); 
    ::GlobalFree(hMem); 
    CalcSize(); 
    return TRUE; 
    } 
    void CPicture::CalcSize() 
    { 
    if(m_pPic == NULL) return; 
    m_pPic->get_Width(&_w_him); 
    m_pPic->get_Height(&_h_him); 
    CDC* pDC = CWnd::GetDesktopWindow()->GetDC(); 
    m_size.cx = _w_him; 
    m_size.cy = _h_him; 
    pDC->HIMETRICtoDP(&m_size); 
    CWnd::GetDesktopWindow()->ReleaseDC(pDC); 
    } 
    void CPicture::Draw(CDC* pDC, LPCRECT lprcDest, LPCRECT lprcSrc) 
    { 
    if(m_pPic) 
    { 
    CSize szOrig(lprcSrc->left, lprcSrc->top); 
    CSize szSrc(lprcSrc->right – lprcSrc->left, lprcSrc->bottom – lprcSrc->top); 
    pDC->DPtoHIMETRIC(&szOrig); 
    pDC->DPtoHIMETRIC(&szSrc); 
    m_pPic->Render(*pDC, lprcDest->left,lprcDest->top,lprcDest->right-lprcDest->left, 
    lprcDest->bottom-lprcDest->top, szOrig.cx, _h_him-szOrig.cy, szSrc.cx, 
    -szSrc.cy, NULL); 
    } 
    } 
    void CPicture::Draw(CDC* pDC, int xDest,int yDest, int cxDest, int cyDest , 
    int xSrc ,int ySrc ,int cxSrc ,int cySrc) 
    { 
    Draw(pDC, CRect(xDest, yDest, xDest+cxDest, yDest+cyDest), CRect(xSrc, ySrc, xSrc+cxSrc, ySrc+cySrc)); 
    }

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全