分享
分销 收藏 举报 申诉 / 5
播放页_导航下方通栏广告

类型VC界面显示图片.doc

  • 上传人:pc****0
  • 文档编号:5702136
  • 上传时间:2024-11-15
  • 格式:DOC
  • 页数:5
  • 大小:36KB
  • 下载积分:10 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    VC 界面 显示 图片
    资源描述:
    VC界面显示图片(JPG JPEG GIF) 2007-12-23 02:14 一、 引言   JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛的认可。GIF格式虽然仅支持256色但它对于颜色较少的图像有着很高的压缩率,甚至超过JPEG标准,也得到了广泛的认同。但作为众多程序员的一个重要的开发工具--Microsoft Visual C++ 6.0的MFC库却仅对没有经过任何压缩的BMP位图文件有着良好的支持,可以读取、显示、存储甚至在内存中创建一块内存位图。由于BMP格式的图像没有经过任何的压缩,不论是作为程序的外部文件,还是作为程序的内部资源都要占据大量的空间,尤其是后者会大大增加可执行文件的长度。可以看出,如果能用经过压缩、具有较好的压缩率的JPEG或GIF格式的图像来取代BMP文件在VC中的应用,无疑还是很有吸引力的。 二、 设计思路   虽然有一些操作、处理JPEG、GIF等其他格式图像的Active X控件,但总的来说使用起来并不太方便,笔者经过实验摸索,总结出了一种借助于COM接口的OLE方法来实现上述功能的一种简便方法,现介绍如下以飨广大读者: 下面我们要使用IPicture 的COM接口,有必要对该图像接口做些了解:该接口主要管理图像对象及其属性,图像对象为位图、图标和图元等提供一种与语言无关的抽象。和标准的字体对象一样,系统也提供了对图像对象的标准实现。其主要的接口是IPicture和IPictureDisp,后者是由IDispatch接口派生以便通过自动化对图像的属性进行访问。图像对象也支持外部接口IPropertyNotifySink,以便用户能在图像属性发生改变时作出决定。图像对象也支持IPersistStream接口,所以它能从一个IStream接口的实例对象保存、装载自己,而IStream接口也支持对流对象的数据读写。   我们可以用函数OleLoadPicture从包含有图像数据的流中装载图像。该函数简化了基于流的图像对象的创建过程,可以创建一个新的图像对象并且用流中的内容对它进行初始化。其函数原型为: STDAPI OleLoadPicture( IStream * pStream, //指向包含有图像数据的流的指针LONG lSize, //从流中读取的字节数BOOL fRunmode, //图像属性对应的初值REFIID riid, //涉及到的接口标识,描述要返回的接口指针的类型VOID ppvObj // 在rrid中用到的接口指针变量的地址); 三、 具体的实现   在显示图像之前,首先要获取到图像文件的存放路径,这里采用标准的文件打开对话框来选取图像文件,文件名存放在CString型的变量m_sPath中: CFileDialog dlg(TRUE,"jpg","*.jpg", OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif||",NULL); if(dlg.DoModal()==IDOK) { m_sPath=dlg.GetPathName(); Invalidate(); } 为简单计,图形显示的代码直接在视类中的OnDraw中编写,首先打开文件并判断文件的可用性,并把文件内容放到流接口IStream的对象pStm中: IStream *pStm; CFileStatus fstatus; CFile file; LONG cb; …… if (file.Open(m_Path,CFile::modeRead)&&file.GetStatus(m_Path,fstatus)&& ((cb = fstatus.m_size) != -1)) { HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb); LPVOID pvData = NULL; if (hGlobal != NULL) { if ((pvData = GlobalLock(hGlobal)) != NULL) { file.ReadHuge(pvData, cb); GlobalUnlock(hGlobal); CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); } } }   然后,就直接调用OleLoadPicture函数从流中装载图像: IPicture *pPic; …… OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic));   由于该函数有时会导致失败,所以应当用SUCCEEDED宏来做一些适当的保护工作,只有在数据装载成功的前提下才能继续下面的图像显示工作: 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; …… 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); if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL))) AfxMessageBox("渲染图像失败!"); pPic->Release(); } else AfxMessageBox("从流中装载图像失败!");   其中,显示工作主要是由IPicture接口对象的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 //指向目标图元设备环境句柄的指针);   小结:到此为止,通过上述代码已经能够在程序的客户区内显示JPEG、GIF等标准的图像了,但对于有多帧图片(即有动画)的GIF格式的图像,目前还只能显示第一帧,如要完整的显示GIF 动画的全过程,还需要外部Active X控件的支持。 楼主意思是用VC编程以实现打开BMP图像,以便后续的图像处理吧?? 其实网上有很多源代码,很多书上也有!! 1、要知道BMP的结构,它包括文件头、信息头、颜色表和图像数据四部分! 2、然后把BMP的四部分一部分一部分打开,前面两个头信息包括一些对你后续有用的数据,最后的图像数据部分就是我们进行图像处理真正的数据! 3、图像读进来以后,可以自己做一下显示函数(如:StretchDIBits),就可以显示了! 个人觉得打开BMP是图像处理的基础,即使用了别人的程序,最好自己也要看懂,这样既可以了解BMP的结构有利于图像处理,而且对编程提高也有用! 前几天我也刚刚学了这个,拿出大家看一下,比较有没有更简单的方法 代码如下: (1)在头文件里的加: #define VIDEOHEIGHT 600 #define VIDEOWIDTH 800 BITMAPINFO bitInfo; BITMAPFILEHEADER bitFile; BYTE ImgBuf[VIDEOWIDTH*VIDEOHEIGHT*3]; BYTE ImgBuf_temp[VIDEOWIDTH*VIDEOHEIGHT*3]; #define bheight bitInfo.bmiHeader.biHeight #define bwidth bitInfo.bmiHeader.biWidth (2)初始化   bitInfo.bmiHeader.biBitCount = 24; bitInfo.bmiHeader.biClrImportant = 0; bitInfo.bmiHeader.biClrUsed = 0; bitInfo.bmiHeader.biCompression = BI_RGB; bitInfo.bmiHeader.biHeight = VIDEOHEIGHT; bitInfo.bmiHeader.biWidth = VIDEOWIDTH; bitInfo.bmiHeader.biPlanes = 1; bitInfo.bmiHeader.biSize = 40; bitInfo.bmiHeader.biSizeImage = VIDEOWIDTH*VIDEOHEIGHT*3; bitInfo.bmiHeader.biXPelsPerMeter = VIDEOWIDTH; bitInfo.bmiHeader.biYPelsPerMeter = VIDEOHEIGHT; (3)在你的消息响应里的代码   CFileDialog dlg(true,NULL,NULL,OFN_HIDEREADONLY, "BMP(*.bmp)|*.bmp||",NULL); if(dlg.DoModal() == IDOK) pathName = dlg.GetPathName(); CFile f; f.Open(pathName , CFile::modeRead , NULL); f.Read(&bitFile,sizeof(BITMAPFILEHEADER)); f.Read(&bitInfo,sizeof(BITMAPINFOHEADER)); f.Read(ImgBuf,bwidth*bheight*3); memcpy(ImgBuf_temp,ImgBuf,bwidth*bheight*3); CDC MemDC; CBitmap bitmap; CClientDC dc(this); bitmap.CreateCompatibleBitmap(&dc,bwidth,bheight); MemDC.CreateCompatibleDC(&dc); MemDC.SelectObject(&bitmap); SetStretchBltMode(MemDC.m_hDC,BLACKONWHITE);//COLORONCOLOR); StretchDIBits(MemDC.m_hDC,0,0,bwidth,bheight, 0,0,bwidth,bheight,ImgBuf,&bitInfo,DIB_RGB_COLORS,SRCCOPY); dc.BitBlt(0,0,bwidth,bheight,&MemDC,0,0,SRCCOPY); MemDC.DeleteDC();
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:VC界面显示图片.doc
    链接地址:https://www.zixin.com.cn/doc/5702136.html
    页脚通栏广告

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork