JPG,动态GIF,BMP一些常用解决办法
2004-12-10 17:26
435 查看
JPG,动态GIF,BMP一些常用解决办法
常用方式0,使用GIF89A类: 优势: 一招鲜吃遍天,上至动态GIF,下至静态JPG,BMP两句搞定,简单方便 缺点: 有时会出现边缘效果, 有的图像会挺明显 使用方法: #include "gif89a.h" CGif89a* gif; 在调用函数内添加: gif=new CGif89a(this->m_hWnd); gif->Load("test.gif"); gif->SetPosition(100,100); gif->Play(); //gif->Pause(TRUE); //Pause(TRUE)为暂停GIF的播放 //gif->Pause(FALSE);//Pause(FALSE)为继续GIF的播放 常用方式1,使用iPicture: 优势: MS早期的图片类, 可以显示所有的静态图片, 显示动态GIF尚需一个GIF的图象储存结构gifImage,如果有兴趣可以看看薛碧的如何在VC中显示动态的GIF 缺点: 用户自主定义不太方便, 薛碧文章是介绍在RC静态编辑显示动态GIF的办法,本来打算改写一下作个GIF类, 发现了GIF89A, 于是没作了多余工 调用方法: CString sPath; sPath=_T("1.JPG"); //CDC* pDC = GetDlgItem(IDC_CONTROL)->GetDC();//获得控件DC CRect zcRect; GetClientRect(&zcRect); ShowJpgGif(pDC,sPath,zcRect.left,zcRect.top,zcRect.Width(),zcRect.Height()); 函数实现 BOOL ShowJpgGif(CDC* pDC,CString strPath, int x, int y ,int Width, int Height) { IStream *pStm; CFileStatus fstatus; CFile file; LONG cb; //打开文件并检测文件的有效性 if (file.Open(strPath,Cfile&::modeRead)&& file.GetStatus(strPath,fstatus)&& ((cb = fstatus.m_size) != -1)) { HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb); LPVOID pvData = NULL; if (hGlobal != NULL) { pvData = GlobalLock(hGlobal); if (pvData != NULL) { file.Read(pvData, cb); GlobalUnlock(hGlobal); CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); } } } else { return false; } //打开文件结束 //显示JPEG和GIF格式的图片,GIF只能显示一帧,还不能显示动画, //要显示动画GIF请使用ACTIVE控//件。 IPicture *pPic; //load image from file stream if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic))) { OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; pPic->get_Width(&hmWidth); pPic->get_Height(&hmHeight); double fX,fY; //get image height and width fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/ (double)pDC->GetDeviceCaps(HORZSIZE)*100.0; fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/ (double)pDC->GetDeviceCaps(VERTSIZE)*100.0; //use render function display image if(FAILED(pPic->Render(*pDC, x, y, Width, Height,0, hmHeight,hmWidth,-hmHeight,NULL))) { pPic->Release(); return false; } pPic->Release(); } else { return false; } return true; } 常用方式2, 使用MS CImage 优点: MS的最新图像类,MFC/ATL通用, 应该是可靠的,使用也很简单方便,较为灵活,目的应该为替代iPicture类 缺点: 还是不能完美的解决动态GIF问题, #include <atlimage.h> CImage m_Image; //pS: 以下插入调用函数 CString strFilter; CSimpleArray<GUID> aguidFileTypes; HRESULT hResult; //CImage m_Image; // 获取CImage支持的图像文件的过滤字符串 hResult = m_Image.GetExporterFilterString(strFilter,aguidFileTypes,_T( "All Image Files")); if (FAILED(hResult)) { MessageBox("GetExporterFilter调用失败!"); return; } CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter); if(IDOK != dlg.DoModal()) return; m_Image.Destroy(); // 将外部图像文件装载到CImage对象中 hResult = m_Image.Load(dlg.GetFileName()); if (FAILED(hResult)) { MessageBox("调用图像文件失败!"); return; } // 设置主窗口标题栏内容 CString str; str.LoadString(AFX_IDS_APP_TITLE); AfxGetMainWnd()->SetWindowText(str + " - " +dlg.GetFileName()); Invalidate(); // 强制调用OnDraw //PS: 以下插入重画函数 void Ctemp7View::OnDraw(CDC* pDC) { Ctemp7Doc* pDoc = Getdocument.); ASSERT_VALID(pDoc); // TODO: 在此处为本机数据添加绘制代码 if (!m_Image.IsNull()) { CRect zcRect; GetClientRect(&zcRect); m_Image.Draw(pDC->m_hDC,zcRect.left,zcRect.top,zcRect.Width(),zcRect.Height()); } } 本文演示代码打包下载: PIC_test.rar |
相关文章推荐
- 关于常用的JPG,动态GIF,BMP等一些常用解决办法(荣誉,热情,智慧,梦想,皆归于开源作者们)
- 关于常用的JPG,动态GIF,BMP等一些常用解决办法
- npm使用过程中的一些错误解决办法及npm常用命令
- mysql从服务器的一些常用命令和从服务器无法同步时的解决办法
- npm使用过程中的一些错误解决办法及npm常用命令
- npm使用过程中的一些错误解决办法及npm常用命令
- npm使用过程中的一些错误解决办法及npm常用命令
- 使用devstack安装openstack过程中遇到的一些错误及解决办法
- 关于用WUBI安装体验Ylmf-linux-1.15,出现(不能检索一些必需都文件)解决办法
- 刚刚开始学AT89S52单片机遇到的一些小问题 + 个人解决办法
- pygame.error: Couldn't open images\ship.bmp的解决办法
- 项目适配iOS9遇到的一些问题及解决办法
- linux(centos5.5)下编译php时的一些典型错误及解决办法。
- IIS7web服务器调试ASP.net程序遇到的一些故障的解决办法
- VS单元测试的一些常见问题和解决办法
- Xode 8遇到的一些问题及解决办法
- 解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
- 关于ASP.NET在IIS上的一些问题的解决办法
- 关于制作JS滚动特效常用的ScrollPic.js文件在IE6下不兼容的解决办法
- 介绍下一些攻击及解决办法