简述实现步骤如下:
1、通过点击浏览按钮选择JPG图像文件
点击浏览按钮打开文件对话框选择JPG图像文件,得到文件所在的路径目录。
关键代码如下:
char
szFilter[]
=
"
JPG Files (*.jpg)|*.jpg|JPEG Files (*.jpeg)|*.jpeg|GIF Files (*.gif)|*.gif|All Files (*.*)|*.*||
"
;
CFileDialog dlg(TRUE, " jpg|jpeg|gif " ,NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
if (dlg.DoModal() == IDOK)
... {
CString strPathName = dlg.GetPathName();
}
CFileDialog dlg(TRUE, " jpg|jpeg|gif " ,NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
if (dlg.DoModal() == IDOK)
... {
CString strPathName = dlg.GetPathName();
}
主要通过COM类—IPicture实现。
关键代码如下:
BOOL CShowJPGDlg::LoadJPGFile(
const
char
*
pPathname)
... {
CFile file;
if( !file.Open( pPathname, CFile::modeRead) )
return FALSE;
DWORD m_nFileLen;
m_nFileLen = file.GetLength();
HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, m_nFileLen );
LPVOID lpBuf = ::GlobalLock( hMem );
if( file.ReadHuge( lpBuf, m_nFileLen ) != m_nFileLen )
return FALSE;
file.Close();
::GlobalUnlock( hMem );
if ( CreateStreamOnHGlobal( hMem, TRUE, &pStream ) !=S_OK )
return FALSE;
if ( OleLoadPicture( pStream, m_nFileLen, TRUE, IID_IPicture, ( LPVOID * )&pPicture ) !=S_OK )
return FALSE;
return TRUE;
}
... {
CFile file;
if( !file.Open( pPathname, CFile::modeRead) )
return FALSE;
DWORD m_nFileLen;
m_nFileLen = file.GetLength();
HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, m_nFileLen );
LPVOID lpBuf = ::GlobalLock( hMem );
if( file.ReadHuge( lpBuf, m_nFileLen ) != m_nFileLen )
return FALSE;
file.Close();
::GlobalUnlock( hMem );
if ( CreateStreamOnHGlobal( hMem, TRUE, &pStream ) !=S_OK )
return FALSE;
if ( OleLoadPicture( pStream, m_nFileLen, TRUE, IID_IPicture, ( LPVOID * )&pPicture ) !=S_OK )
return FALSE;
return TRUE;
}
3、在屏幕上显示JPG图像
主要通过Render函数实现显示JPG图像。
Render函数说明
HRESULT Render( HDC hdc, //设备环境句柄
long x, //在hdc上的水平坐标
long y, //在hdc上的垂直坐标
long cx, //图像宽度
long cy, //图像高度
OLE_XPOS_HIMETRIC xSrc, //在源图像上的水平偏移
OLE_YPOS_HIMETRIC ySrc, //在源图像上的垂直偏移
OLE_XSIZE_HIMETRIC cxSrc, //在源图像上水平拷贝的数量
OLE_YSIZE_HIMETRIC cySrc, //在源图像上垂直拷贝的数量
LPCRECT prcWBounds //指向目标图元设备环境句柄的指针
);
关键代码如下:
void
CShowJPGDlg::DrawImage(
int
x,
int
y, CDC
*
pDC)
... {
if (pPicture != NULL)
...{
long nWidth,nHeight;
pPicture->get_Width( &nWidth );
pPicture->get_Height( &nHeight );
/**//*
//图片原大显示
CSize sz( nWidth, nHeight );
pDC->HIMETRICtoDP( &sz );
pPicture->Render(pDC->m_hDC,0,0,sz.cx,sz.cy,0,nHeight,nWidth,-nHeight,NULL);
*/
//按窗口尺寸显示
CRect rect;
GetClientRect(&rect);
pPicture->Render(pDC->m_hDC,x,y,rect.Width(),rect.Height(),0,nHeight,nWidth,-nHeight,NULL);
}
}
... {
if (pPicture != NULL)
...{
long nWidth,nHeight;
pPicture->get_Width( &nWidth );
pPicture->get_Height( &nHeight );
/**//*
//图片原大显示
CSize sz( nWidth, nHeight );
pDC->HIMETRICtoDP( &sz );
pPicture->Render(pDC->m_hDC,0,0,sz.cx,sz.cy,0,nHeight,nWidth,-nHeight,NULL);
*/
//按窗口尺寸显示
CRect rect;
GetClientRect(&rect);
pPicture->Render(pDC->m_hDC,x,y,rect.Width(),rect.Height(),0,nHeight,nWidth,-nHeight,NULL);
}
}
显示JPEG、GIF和JPG是一样的。
相比较BMP图像,JPG、JPEG、GIF图像有很多优点。但BMP图像在VC中的处理好像更理所当然一点,相信这种COM实现显示JPG、JPEG、GIF图像的处理让我们更是耳目一新。