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

收藏:IPicture总结的更多相关文章

  1. h5应用缓存及收藏时Icon显示

    h5应用实现离线缓存,加载后,断网仍然可以继续使用. 一.需求 转行做h5,目前做赛道游戏,动手做了个赛道编辑器web版的,由于web版需要开启服务器才能使用,策划要想回家使用就要发布到外网服务器了, ...

  2. 基于Metronic的Bootstrap开发框架经验总结(13)--页面链接收藏夹功能的实现2(利用Sortable进行拖动排序)

    在上篇随笔<基于Metronic的Bootstrap开发框架经验总结(12)--页面链接收藏夹功能的实现>上,我介绍了链接收藏夹功能的实现,以及对收藏记录的排序处理.该篇随笔主要使用功能按 ...

  3. 修复 Windows7 资源管理器左侧收藏夹无法展开问题

    相信大家在网上搜多到的解决办法大多数都是修改注册表,但是这个办法多数是无效的 1.运行regedit 2.展开到HKEY_CLASSES_ROOT\lnkfile 3.添加一个字符串值:IsShort ...

  4. Go收藏

    Go项目收藏 电子书 1.Go Web 编程 2.Go入门指南(the-way-to-go_ZH_CN) 3.Go语言圣经(中文版) Go by Example 中文 一些Go英文电子书 High P ...

  5. 33个超级有用必须要收藏的PHP代码样例

    作为一个正常的程序员,会好几种语言是十分正常的,相信大部分程序员也都会编写几句PHP程序,如果是WEB程序员,PHP一定是必备的,即使你没用开发过大型软件项目,也一定多少了解它的语法. 在PHP的流行 ...

  6. .NET中操作IPicture、IPictureDisp的小随笔

    [题外话] 最近在做一个调用某实验仪器的程序,这个仪器提供了Windows上COM的接口.调用仪器的时候需要传输图片,提供的接口里使用了IPicture这个接口,由于以前没接触过,所以查找了一些资料, ...

  7. 基于Metronic的Bootstrap开发框架经验总结(12)--页面链接收藏夹功能的实现

    在一个系统里面,往往有很多菜单项目,每个菜单项对应一个页面,一般用户只需要用到一些常用的功能,如果每次都需要去各个层次的菜单里面去找对应的功能,那确实有点繁琐.特别是在菜单繁多,而客户又对系统整体不熟 ...

  8. JQUERY 实现加入收藏夹功能

    关于"加入收藏"的代码,很多人都不会重视,一般情况是随便在网上搜一个代码放在页面里就草草了事了.可是都没有做到主流浏览器的兼容.下面分享一段使用 jQuery 实现加入收藏夹的功能 ...

  9. Chrome插件: 网站收藏

      在工作中我们会收藏很多网址.以前一直都是用的chrome里面的收藏夹.后面觉得一点都不方便.看一下Chrome插件开发挺容易入手的所以自己写了一个Chrome插件. 基于:Angularjs + ...

随机推荐

  1. Getting Start chrome-extension demo

    写一个小小的chrome扩展demo~ 准备工作 了解一下插件chrome-extension: 在应用商店里的插件基本上都是以.crx为文件后缀,该文件其实就是一个压缩包,包括插件所需要的html. ...

  2. 《网络对抗》Exp7 网络欺诈防范

    20155336<网络对抗>Exp7 网络欺诈防范 实验内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 简单应用SET工具建立冒名网站 (1分 ...

  3. 20155337 《网络对抗》 Exp2 后门原理与实践

    20155337 <网络对抗> Exp2 后门原理与实践 一.基础问题回答 - 例举你能想到的一个后门进入到你系统中的可能方式? 在Unix里,login程序通常用来对telnet来的用户 ...

  4. 通过定义过滤器filter解决跨域问题

            跨域是比较常见问题,比较简单的方式就是直接定义一个过滤器filter,然后在请求头里面加上一些参数.下面来看看具体的写法吧. 一.java代码 package com.hj.usera ...

  5. python 回溯法 子集树模板 系列 —— 3、0-1背包问题

    问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得放入背包的物品的总价值为最大? 分析 显然,放入背包的物品,是N个物品的所有子集的其 ...

  6. java中多态的实现机制

    多态的概念: 简单来说就是事物在运行过程中存在的不同状态,即父类或接口定义的引用变量指向子类或具体实现类的实例对象.程序调用方法在运行期才进行动态绑定,而不是引用变量的类型中定义的方法. 多态存在的前 ...

  7. 机器学习中几种优化算法的比较(SGD、Momentum、RMSProp、Adam)

    有关各种优化算法的详细算法流程和公式可以参考[这篇blog],讲解比较清晰,这里说一下自己对他们之间关系的理解. BGD 与 SGD 首先,最简单的 BGD 以整个训练集的梯度和作为更新方向,缺点是速 ...

  8. Vigenere加密

    Vigenere加密法原理很简单,实现起来也不难.与普通的单码加密法不同,明文经过加密之后,每个字母出现的频率就不会有高峰和低峰. 密钥中字母代表行和明文中的字母代表行.在vigenere表中找到对应 ...

  9. 微软职位内部推荐-Senior Software Engineer-Eco

    微软近期Open的职位: The MOD Ecosystem team is dedicated to expanding the reach and value of Office by enabl ...

  10. Linux内核分析——第一周学习笔记

    20135313吴子怡.北京电子科技学院 chapter 1 知识点梳理 第一节 存储程序计算机工作模型 1.冯诺依曼体系结构:即具有存储程序的计算机体系结构.目前大多数拥有计算和存储功能的设备(智能 ...