现在的位置: 首页 > 综合 > 正文

VC 显示jpg文件

2013年08月01日 ⁄ 综合 ⁄ 共 4839字 ⁄ 字号 评论关闭

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;

记得声明以上的函数

}

抱歉!评论已关闭.