zoukankan      html  css  js  c++  java
  • 收藏:IPicture总结

    1、IPicture接口对象的创建
    方法1:直接通过文件创建
    LPCSTR szFileUrl;
     IPicture *pIPicture;
     OleLoadPicturePath(CComBSTR(szFileUrl), 
       (LPUNKNOWN)NULL, 
       0, 
       0, 
       IID_IPicture,
       (LPVOID*)&pIPicture))
    方法2:通过IStream来创建
     // 加载电子地图
     LPCSTR szFileUrl;
     IStream *pStream = NULL;
     IPicture *pIPicture = NULL;;
     CFileStatus fstatus;
     CFile file;
     LONG lFileSize;
     HGLOBAL hGlobal;
     if(file.Open(szFileUrl, CFile::modeRead) && file.GetStatus(szFileUrl, fstatus) 
      && ((lFileSize = fstatus.m_size) != -1))
     {
      hGlobal = GlobalAlloc(GMEM_MOVEABLE, lFileSize);// 开辟大内存
      if(hGlobal != NULL)
      {
       LPVOID pvData = NULL;
       pvData = GlobalLock(hGlobal);
       if(pvData != NULL)
       { 
        file.ReadHuge(pvData, lFileSize);   // 将图片数据保存在内存中
        GlobalUnlock(hGlobal);
        CreateStreamOnHGlobal(hGlobal, TRUE, &m_pIStream);  // 创建流
        file.Close();
       }
       else
       {
        GlobalFree(hGlobal);
        return;
       }
      }
      else
      {
       file.Close();
       return;
      }
     }
     else
     {
      //打开图片失败
      return;
     }
     OleLoadPicture(m_pIStream, fstatus.m_size, TRUE, IID_IPicture, (LPVOID*)&m_pIPicture);
     GlobalFree(hGlobal);

    2、通过IPicture来获取图片的尺寸
     OLE_XSIZE_HIMETRIC hmPicWidth;       
     OLE_YSIZE_HIMETRIC hmPicHeight;      
     pIPicture->get_Width(&hmPicWidth);   // 获取图像宽度
     pIPicture->get_Height(&hmPicHeight); // 获取图像高度
     // 转化单位为象素
     nPicWidth = MulDiv(hmPicWidth, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSX), HIMETRIC_PER_INCH);
     nPicHeight = MulDiv(hmPicHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY), HIMETRIC_PER_INCH);


     

    3、通过IPicture来画图
    void ShowPicture(CDC *pDC)
    {
     OLE_XPOS_HIMETRIC xSrc;  // 图片中当前显示区域的x
     OLE_YPOS_HIMETRIC ySrc;  // 图片中当前显示区域的y
     OLE_XSIZE_HIMETRIC cxSrc; // 图片中当前显示区域的宽度
     OLE_YSIZE_HIMETRIC cySrc; // 图片中当前显示区域的高度
     m_pIPicture->Render(*pDC, 0, 0, m_rcBox.Width(), m_rcBox.Height(), xSrc, ySrc, cxSrc, cySrc, NULL);
    }


    4、将IPicture中的图片保存起来
    BOOL SaveToFileFromIPicture(LPCSTR szFileName, IPicture *pPic)
    {
     // Create ILockBytes Buffer
     ILockBytes *plkbyt = NULL;
     CreateILockBytesOnHGlobal(NULL, TRUE, &plkbyt); 

     // Create IStorage
     IStorage   *pStorage = NULL;
     HRESULT hr = ::StgCreateDocfileOnILockBytes(plkbyt,
      STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
     if (FAILED(hr))
     {
      plkbyt->Release();
      plkbyt = NULL;
      return FALSE;
     }

     // Create IStream
     IStream    *pStream = NULL;
     hr = pStorage->CreateStream(L"PICTURE",
      STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &pStream);
     if (FAILED(hr))
     {
      pStorage->Release();
      pStorage = NULL;
      plkbyt->Release();
      plkbyt = NULL;
      return FALSE;
     }
     
     // Copy Data Stream
     long  lSize;
     hr = pPic->SaveAsFile(pStream, TRUE, &lSize); 
     if (FAILED(hr))
     {
      pStream->Release();
      pStream = NULL;
      pStorage->Release();
      pStorage = NULL;
      plkbyt->Release();
      plkbyt = NULL;
      return FALSE;
     }
     // Get Statistics For Final Size Of Byte Array
     STATSTG  statStg;
     hr = plkbyt->Stat(&statStg, STATFLAG_NONAME);
     if (FAILED(hr))
     {
      pStream->Release();
      pStream = NULL;
      pStorage->Release();
      pStorage = NULL;
      plkbyt->Release();
      plkbyt = NULL;
      return FALSE;
     }

     // calculate "Pure" Picture Data, Must Be In a 512 Blocks...
     double  dbSkipFloat = (double(lSize) / 512);   
     DWORD  dwPicDataSize = 0;
     if(dbSkipFloat > DWORD(dbSkipFloat)) 
     {
      dwPicDataSize = (DWORD)dbSkipFloat + 1;
     }
     else 
     {
      dwPicDataSize = (DWORD)dbSkipFloat;
     }
     dwPicDataSize = dwPicDataSize * 512; 
     // Allocate Only The "Pure" Picture Data
     BYTE  *pPicDataBuffer = (BYTE*)malloc(dwPicDataSize);
     if (pPicDataBuffer == NULL)
     {
      pStream->Release();
      pStream = NULL;
      plkbyt->Release();
      pStorage->Release();
      pStorage = NULL;
      plkbyt = NULL;
      return FALSE;
     }
     
     // Read "Pure" Picture Data to Buffer
     _ULARGE_INTEGER ulOffset;
     ulOffset.LowPart = 0;
     ulOffset.HighPart = 0;
     ulOffset.QuadPart = (DWORD)(statStg.cbSize.QuadPart - dwPicDataSize);
     DWORD dwRealDataSize;
     hr = plkbyt->ReadAt(ulOffset, pPicDataBuffer, dwPicDataSize, &dwRealDataSize);
     if (FAILED(hr))
     {
      free(pPicDataBuffer);
      pPicDataBuffer = NULL;
      pStream->Release();
      pStream = NULL;
      pStorage->Release();
      pStorage = NULL;
      plkbyt->Release();
      plkbyt = NULL;
      return FALSE;
     }
     
     // Save "Pure" Picture Data to file
     CFile  fBmp; 
     CFileException e;
     if (!fBmp.Open(szFileName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
     {
      free(pPicDataBuffer);
      pPicDataBuffer = NULL;
      pStream->Release();
      pStream = NULL;
      pStorage->Release();
      pStorage = NULL;
      plkbyt->Release();
      plkbyt = NULL;
      return FALSE;
     }
     fBmp.Write(pPicDataBuffer, dwRealDataSize);
     fBmp.Close();
     free(pPicDataBuffer);
     pPicDataBuffer = NULL;
     pStream->Release();
     pStream = NULL;
     pStorage->Release();
     pStorage = NULL;
     plkbyt->Release();
     plkbyt = NULL;
     return TRUE;
    }


    5、将IPicture中图片按规定的尺寸保存
    BOOL CIPictureDlg::Save2File(LPCSTR szFileName, IPicture *pPic, int nWidth, int nHeight)
    {
     // create a new IPicture
     OLE_HANDLE hPic = NULL;
     if (FAILED(pPic->get_Handle(&hPic)))
     {
      return FALSE;
     }
     HBITMAP hBmp = (HBITMAP)CopyImage((HANDLE)hPic,
       IMAGE_BITMAP, 
       nWidth, 
       nWidth, 
       LR_CREATEDIBSECTION);
     if (hBmp == NULL)
     {
      return FALSE;
     }
     PICTDESC picDesc;
     picDesc.cbSizeofstruct = sizeof(PICTDESC);
     picDesc.picType = PICTYPE_BITMAP;
     picDesc.bmp.hbitmap = hBmp;

     IPicture *pNewPic = NULL;
     if (SUCCEEDED(OleCreatePictureIndirect(&picDesc, IID_IPicture, FALSE, (LPVOID *)&pNewPic)))
     {
      // Save to file
      Save2File(szFileName, pNewPic);
      pNewPic->Release();
      pNewPic = NULL;
      DeleteObject(hBmp);
      hBmp = NULL;
      return TRUE;
     }
     DeleteObject(hBmp);
     hBmp = NULL;
     return FALSE;
    }

    来源:http://blog.csdn.net/crearo/article/details/1328974

  • 相关阅读:
    js常用工具函数
    vue-cli跨域问题解决
    charles抓包404问题(左侧不显示配置)
    vuex存储与本地储存(localstorage、sessionstorage)的区别(笔记)
    借助axios的拦截器实现Vue.js中登陆状态校验的思路(笔记)
    cornerstone使用注意点
    本地仓库连接远程仓库,git本地新建项目上传到远程git仓库上正确流程
    做一个不那么差的程序员
    解决 php Call to undefined function shm_attach()
    Redis 常用的数据结构
  • 原文地址:https://www.cnblogs.com/personnel/p/4584822.html
Copyright © 2011-2022 走看看