VC 显示JPG
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();
}
2、加载JPG文件到内存
主要通过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;
}
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);
}
}
注意:由于是主要通过COM类—IPicture实现的,不要忘记了CoInitialize(NULL);,用完了CoUninitialize();。
显示JPEG、GIF和JPG是一样的。
相比较BMP图像,JPG、JPEG、GIF图像有很多优点。但BMP图像在VC中的处理好像更理所当然一点,相信这种COM实现显示JPG、JPEG、GIF图像的处理让我们更是耳目一新。
VC显示jpg图片
void CxxxView::OnDraw(CDC* pDC)
{
::CoInitialize(NULL); // COM 初始化
HRESULT hr;
CFile file;
file.Open( "c://aa.jpg ", CFile::modeRead ¦ CFile::shareDenyNone ); // 读入文件内容
DWORD dwSize = file.GetLength();
HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize );
LPVOID lpBuf = ::GlobalLock( hMem );
file.ReadHuge( lpBuf, dwSize );
file.Close();
::GlobalUnlock( hMem );
IStream * pStream = NULL;
IPicture * pPicture = NULL;
// 由 HGLOBAL 得到 IStream,参数 TRUE 表示释放 IStream 的同时,释放内存
hr = ::CreateStreamOnHGlobal( hMem, TRUE, &pStream );
ASSERT ( SUCCEEDED(hr) );
hr = ::OleLoadPicture( pStream, dwSize, TRUE, IID_IPicture, ( LPVOID * )&pPicture );
ASSERT(hr==S_OK);
long nWidth,nHeight; // 宽高,MM_HIMETRIC 模式,单位是0.01毫米
pPicture- >get_Width( &nWidth ); // 宽
pPicture- >get_Height( &nHeight ); // 高
原大显示//
CSize sz( nWidth, nHeight );
pDC- >HIMETRICtoDP( &sz ); // 转换 MM_HIMETRIC 模式单位为 MM_TEXT 像素单位
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,0,0,rect.Width(),rect.Height(),
// 0,nHeight,nWidth,-nHeight,NULL);
if ( pPicture ) pPicture- >Release();// 释放 IPicture 指针
if ( pStream ) pStream- >Release(); // 释放 IStream 指针,同时释放了 hMem
::CoUninitialize();
VC显示jpg图片
丁一两个函数,加入*view.cpp中
bool CTestView::OpenPicFile(char* lpstrFile)
{
IStream *pStm;
BOOL bResult;
HANDLE hFile=NULL;
DWORD dwFileSize,dwByteRead;
//打开硬盘中的图形文件
hFile=CreateFile(lpstrFile,GENERIC_READ,
FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile!=INVALID_HANDLE_VALUE)
{
dwFileSize=GetFileSize(hFile,NULL);//获取文件字节数
if (dwFileSize==0xFFFFFFFF)
return false;
}
else
{
return false;
}
//分配全局存储空间
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
LPVOID pvData = NULL;
if (hGlobal == NULL)
return false;
if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块
return false;
ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
//装入图形文件
bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);
if(FAILED(bResult))
return false;
CloseHandle(hFile);//关闭打开的文件
return true;
}
HRESULT CTestView::ShowPic(HWND hWnd,int nScrWidth,int nScrHeight)
{
HDC hDC_Temp=::GetDC(hWnd);
BOOL bResult;
OLE_XSIZE_HIMETRIC hmWidth;//图片的真实宽度
OLE_YSIZE_HIMETRIC hmHeight;//图片的真实高度
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
//将图形输出到屏幕上(有点像BitBlt)
bResult=pPic->Render(hDC_Temp,0,0,nScrWidth,nScrHeight,0,hmHeight,hmWidth,-hmHeight,NULL);
// pPic->Release();
if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
return E_FAIL;
}
}
然后再哦ondraw()中加入
if (m_openFileSucceed)
{
ShowPic(GetSafeHwnd(),1024,768);
}
在构造函数中加
if (OpenPicFile("BackGround.jpg") || OpenPicFile("BackGround.bmp"))
{
m_openFileSucceed = true;
}
else
{
m_openFileSucceed = false;
}
定义个全局的IPicture *pPic;
记得声明以上的函数
}