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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值