收藏: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

时间: 2024-10-13 08:00:06

收藏:IPicture总结的相关文章

在深圳有娃的家长必须要懂的社保少儿医保,不然亏大了!(收藏)

在深圳有娃的家长必须要懂的社保少儿医保,不然亏大了!(收藏) 转载2016-07-26 17:21:47 标签:深圳少儿医保社保医疗保险住院 在深圳工作或生活的家长们可能还有人不清楚,其实小孩子最大的基础保障福利就是少儿医保.如果以前没重视关注的,现在您看到这篇文章还来得及!少儿医保每年政府财政补贴384元,自己只需交200元左右,就可以享受门诊报销1000元,住院报销比例90%,最高报销额度达148万,大病门诊最高报销比例90%!如何享受?有哪些待遇?接下来就详细来做一个介绍: 少儿医保投保需

原创 导出微信收藏到电脑

1.安装模拟器(如:天天模拟器)2.模拟器安装打开微信3.模拟器安装es文件浏览器4.打开微信文件路径:在sdcard的Tencent的MicroMsg的ebb34e976d3351bfe0ab(就是那个最长的,后面就不打出来了)5.模拟器设置共享位置(如:/mnt/asec/share --> 桌面/自定义文件夹)6.用es文件浏览器复制微信收藏文件夹到共享目录(/sdcard/tencent/MicroMsg/********/favorite --> /mnt/asec/share)7.

《鸡啄米C++编程入门系列》系列技术文章整理收藏

<鸡啄米C++编程入门系列>系列技术文章整理收藏 收藏整理鸡啄米C++编程入门系列文章,供个人和网友学习C++时参考 1鸡啄米:C++编程入门系列之前言 2鸡啄米:C++编程入门系列之一(进制数) 3鸡啄米:C++编程入门系列之二(原码.反码与补码) 4鸡啄米:C++编程入门系列之三(VS2010的使用介绍) 5鸡啄米:C++编程入门系列之四(数据类型) 6鸡啄米:C++编程入门系列之五(运算符和表达式) 7鸡啄米:C++编程入门系列之六(算法的基本控制结构之选择结构) 8鸡啄米:C++编程入

设为首页与加入收藏

通用代码: <a href="javascript:;"onclick="this.style.behavior='url(#default#homepage)';this.setHomePage(location.href);">设为首页</a> | <a href="javascript:;" onClick="window.external.AddFavorite(location.href,docu

关于收藏网站

因为公司网页需要顶部的设置首页的收藏需要更新,因为浏览器更新之后,一些js就不能用了 只能兼容ie和火狐 收藏: 火狐:window.sidebar.addPanel(sTitle, sURL, "");这个不能用了 但是发现在a标签添加rel="sidebar"也是可以添加收藏的,title为收藏的名字 所以:function addFavorite(url,title){ if(!window.sidebar){ try{window.external.addF

收藏php

PHP数据库 以下是PHP数据库的代码: <html><head><title></title><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/><style type="text/css">body{background-color: cyan;margin:0 550px 0 516px;

[收藏]win8安装弹出输入的产品密钥与用于安装任何可用windows映像都不匹配

问题描述: 帮朋友装win8(第一次装大神不要喷我啊)结果到 现在安装 这一步的时候 点击 现在安装 弹出个窗口 说输入的产品密钥与用于安装任何可用windows映像都不匹配.请输入其他产品密钥 解决办法: 现在大家一般都用U盘安装的方式,那么只需使用记事本编辑一个名为 EI.CFG 的文本文件(注意不带 .txt 扩展名) ,然后将其放到 Windows 8 安装文件 Sources 文件夹中即可.EI.CFG 文件内容如下: [EditionID] PROFESSIONAL [Channel

微信5.3内测 加强搜索和群,聊天记录也可以收藏

这几天有些用户或许会收到微信5.3内测体验,朋友就是其中幸运的一位,微信5.3会有哪些新特性呢?借他的吉号来see see! 微信5.3内测版带来了5个新特性: ①约定数字,快速建群: 微信5.3内测版再次将群的权重提高,提高用户体验上的优化,增强微信的活跃:进一步消弱QQ群(这是要闹哪样?内斗吗?),甚至对陌陌也产生影响:为O2O等兴趣消费做铺垫 ②收藏添加标签,方便搜索: 收藏添加标签,方便搜索,聊天记录也可以收藏.微信从5.0版本加重搜索功能的权重开始,这次微信在搜索功能上继续加重,聊天记

使用DOM维护手机收藏信息

public class XMLParse3 { // 1.创建解析器工厂 DocumentBuilerFactory // 2.创建解析器 (由解析工厂创建) 即为DocumentBuilder对象 // 3.由解析器对象指定XML文件进行解析, 构造DOM树,创建Document对象 // 4. 以Document对象对DOM树节点的操作, 比如 增删改查 Document doc = null; public void getDocument() { DocumentBuilderFact