收藏: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
收藏:IPicture总结的更多相关文章
- h5应用缓存及收藏时Icon显示
h5应用实现离线缓存,加载后,断网仍然可以继续使用. 一.需求 转行做h5,目前做赛道游戏,动手做了个赛道编辑器web版的,由于web版需要开启服务器才能使用,策划要想回家使用就要发布到外网服务器了, ...
- 基于Metronic的Bootstrap开发框架经验总结(13)--页面链接收藏夹功能的实现2(利用Sortable进行拖动排序)
在上篇随笔<基于Metronic的Bootstrap开发框架经验总结(12)--页面链接收藏夹功能的实现>上,我介绍了链接收藏夹功能的实现,以及对收藏记录的排序处理.该篇随笔主要使用功能按 ...
- 修复 Windows7 资源管理器左侧收藏夹无法展开问题
相信大家在网上搜多到的解决办法大多数都是修改注册表,但是这个办法多数是无效的 1.运行regedit 2.展开到HKEY_CLASSES_ROOT\lnkfile 3.添加一个字符串值:IsShort ...
- Go收藏
Go项目收藏 电子书 1.Go Web 编程 2.Go入门指南(the-way-to-go_ZH_CN) 3.Go语言圣经(中文版) Go by Example 中文 一些Go英文电子书 High P ...
- 33个超级有用必须要收藏的PHP代码样例
作为一个正常的程序员,会好几种语言是十分正常的,相信大部分程序员也都会编写几句PHP程序,如果是WEB程序员,PHP一定是必备的,即使你没用开发过大型软件项目,也一定多少了解它的语法. 在PHP的流行 ...
- .NET中操作IPicture、IPictureDisp的小随笔
[题外话] 最近在做一个调用某实验仪器的程序,这个仪器提供了Windows上COM的接口.调用仪器的时候需要传输图片,提供的接口里使用了IPicture这个接口,由于以前没接触过,所以查找了一些资料, ...
- 基于Metronic的Bootstrap开发框架经验总结(12)--页面链接收藏夹功能的实现
在一个系统里面,往往有很多菜单项目,每个菜单项对应一个页面,一般用户只需要用到一些常用的功能,如果每次都需要去各个层次的菜单里面去找对应的功能,那确实有点繁琐.特别是在菜单繁多,而客户又对系统整体不熟 ...
- JQUERY 实现加入收藏夹功能
关于"加入收藏"的代码,很多人都不会重视,一般情况是随便在网上搜一个代码放在页面里就草草了事了.可是都没有做到主流浏览器的兼容.下面分享一段使用 jQuery 实现加入收藏夹的功能 ...
- Chrome插件: 网站收藏
在工作中我们会收藏很多网址.以前一直都是用的chrome里面的收藏夹.后面觉得一点都不方便.看一下Chrome插件开发挺容易入手的所以自己写了一个Chrome插件. 基于:Angularjs + ...
随机推荐
- Getting Start chrome-extension demo
写一个小小的chrome扩展demo~ 准备工作 了解一下插件chrome-extension: 在应用商店里的插件基本上都是以.crx为文件后缀,该文件其实就是一个压缩包,包括插件所需要的html. ...
- 《网络对抗》Exp7 网络欺诈防范
20155336<网络对抗>Exp7 网络欺诈防范 实验内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 简单应用SET工具建立冒名网站 (1分 ...
- 20155337 《网络对抗》 Exp2 后门原理与实践
20155337 <网络对抗> Exp2 后门原理与实践 一.基础问题回答 - 例举你能想到的一个后门进入到你系统中的可能方式? 在Unix里,login程序通常用来对telnet来的用户 ...
- 通过定义过滤器filter解决跨域问题
跨域是比较常见问题,比较简单的方式就是直接定义一个过滤器filter,然后在请求头里面加上一些参数.下面来看看具体的写法吧. 一.java代码 package com.hj.usera ...
- python 回溯法 子集树模板 系列 —— 3、0-1背包问题
问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得放入背包的物品的总价值为最大? 分析 显然,放入背包的物品,是N个物品的所有子集的其 ...
- java中多态的实现机制
多态的概念: 简单来说就是事物在运行过程中存在的不同状态,即父类或接口定义的引用变量指向子类或具体实现类的实例对象.程序调用方法在运行期才进行动态绑定,而不是引用变量的类型中定义的方法. 多态存在的前 ...
- 机器学习中几种优化算法的比较(SGD、Momentum、RMSProp、Adam)
有关各种优化算法的详细算法流程和公式可以参考[这篇blog],讲解比较清晰,这里说一下自己对他们之间关系的理解. BGD 与 SGD 首先,最简单的 BGD 以整个训练集的梯度和作为更新方向,缺点是速 ...
- Vigenere加密
Vigenere加密法原理很简单,实现起来也不难.与普通的单码加密法不同,明文经过加密之后,每个字母出现的频率就不会有高峰和低峰. 密钥中字母代表行和明文中的字母代表行.在vigenere表中找到对应 ...
- 微软职位内部推荐-Senior Software Engineer-Eco
微软近期Open的职位: The MOD Ecosystem team is dedicated to expanding the reach and value of Office by enabl ...
- Linux内核分析——第一周学习笔记
20135313吴子怡.北京电子科技学院 chapter 1 知识点梳理 第一节 存储程序计算机工作模型 1.冯诺依曼体系结构:即具有存储程序的计算机体系结构.目前大多数拥有计算和存储功能的设备(智能 ...