显示内存中图片数据的实例代码

图片文件的存在形式并不总是文件形式,有时可能是内存块、也有可能是字节流,比如保存于数据库中的某一图片,用GetChunk方法读取出来后一般保存在一个预先分配的内存块中,我们知道内存块的首地址,内存块的大小,要把这样的图片显示出来,可以自己编写函数按文件结构解析数据,但未免太麻烦,也是没有意义的“制造轮子”的重复工作,不如用windows系统自带的Ipicture的COM组件显示图片来得更简便些。下面是核心代码。技巧是把数据内存块转换成一个内存文件CMemFile,不必把图片文件存储成一个临时文件再读取。

#include <atlbase.h>
#include <afxpriv2.h>

void CIpicDlg::ShowPic()
{
	CComQIPtr<IPicture>spIPicture;
	HRESULT m_hr;
	//unsigned char* pPictureData;
	//UINT nPictureSize;
	CRect rc;
	m_wndPic1.GetClientRect(&rc);
	CDC* pDC = m_wndPic1.GetDC();
	if(m_pPictureData)
	{
		CMemFile memfile;
		memfile.Attach(m_pPictureData,m_nPictureSize);
		CArchive ar(&memfile, CArchive::load | CArchive::bNoFlushOnDelete);
		CArchiveStream arcstream(&ar);
		HRESULT hr = OleLoadPicture((IStream*)&arcstream, 0, FALSE,
			IID_IPicture, (void**)&spIPicture);
		ASSERT(SUCCEEDED(hr) && spIPicture);	
		OLE_XSIZE_HIMETRIC hmWidth = 0;
		OLE_YSIZE_HIMETRIC hmHeight = 0;
		m_hr = spIPicture->get_Width(&hmWidth);
		ASSERT(SUCCEEDED(m_hr));
		m_hr = spIPicture->get_Height(&hmHeight);
		ASSERT(SUCCEEDED(m_hr));


		spIPicture->Render(pDC->m_hDC, rc.left, rc.top, rc.Width(), rc.Height(),
			0, hmHeight, hmWidth, -hmHeight, NULL);
		CSize sz(hmWidth,hmHeight);
		pDC->HIMETRICtoDP(&sz);
	}
	if (spIPicture) 
	{
		spIPicture.Release();
	}
}

 

其中m_pPictureData为图片数据块首地址,m_nPictureSize为内存块大小。

测试的VS2005的源代码可以在此下载文件信息】。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值