JPG图片处理.doc_第1页
JPG图片处理.doc_第2页
JPG图片处理.doc_第3页
JPG图片处理.doc_第4页
JPG图片处理.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VC 显示JPG1、通过点击浏览按钮选择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;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论