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;
}
方法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;
}