基于mmx技术电子相册

上传人:F****n 文档编号:98813451 上传时间:2019-09-14 格式:DOCX 页数:10 大小:1.27MB
返回 下载 相关 举报
基于mmx技术电子相册_第1页
第1页 / 共10页
基于mmx技术电子相册_第2页
第2页 / 共10页
基于mmx技术电子相册_第3页
第3页 / 共10页
基于mmx技术电子相册_第4页
第4页 / 共10页
基于mmx技术电子相册_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《基于mmx技术电子相册》由会员分享,可在线阅读,更多相关《基于mmx技术电子相册(10页珍藏版)》请在金锄头文库上搜索。

1、计算机体系结构-MMX实验报告XJTUSE计算机体系结构MMX实验报告Andy2014/12/31专业:软件工程班级:姓名: 学号:计算机体系结构MMX实验一、 实验目的及要求了解并学习Inter微处理器的MMX/SSE相关的技术,用相关的技术,混合其他的编程语言对图像或者是视频进行处理。本实验的目的是通过MMX技术对图形的处理的强大的计算功能,实现图片的渐变,最终利用MMX技术实现一个简易的电子相册应用。二、 实验环境本实验的实验的软件环境:操作系统:Windows 7 64 bits SP1旗舰版开发IDE:visual studio 2010 旗舰版硬件开发环境为Lenovo IdeaP

2、ad Y560处理器:Inter(R)Core(TM) i5 CPU M 480 2.67GHz 2.67 GHzRAM:8G三、 实验内容与步骤1、 MMX技术MMX 是MultiMediaeXtensions(多媒体扩展)的缩写,是为了方便处理大量计算的视频、音频等多媒体数据,特地在CPU中加入的专门用来进行多媒体处理的多媒体数据处理指令MMX。MMX CPU极大地提高了电脑的多媒体(如立体声、视频、三维动画等)处理功能。MMX技术是继Intel386(TM)处理器(将体系结构扩展至32位)之后对Intel体系结构的最重要的加强。MMX技术的基础是一项称为单指令、多数据(SIMD)的技术。

3、它使得许多条信息可由一条单一指令来处理,这种平行操作使性能得以大幅度地提高。MMX技术随着出现后就以后再发展着,目前已经到了SSE指令集。在MMX到SSE之间本质是一样的,只是不用的是指令功能的增强和指令数目的增加,使得我们在处理计算密集型的数据时候更够节省更多的时间。以下就简单介绍下MMX/SSE相关的指令及其优点。MMX技术的基础是一项称为单指令、多数据(SIMD)的技术。它使得许多条信息可由一条单一指令来处理,这种平行操作使性能得以大幅度地提高。MMX基本的指令集有拷贝指令、运算指令、分组指令。MOVQ:64位数据拷贝MOVD:32位数据拷贝PUNPCKLBW/PUNPCKLWD/PUN

4、PCKLDQ:将寄存器的32位数据交错组合为64位的数据PACKUSWB:将16位的数据转换为无符号的8位数据PACKSSWB/PACKSSDW:将32/16位数据转化为16/8位数据PADDB/W/D:加法的运算PASUB/W/D:减法运算 等2、 实验步骤及相关代码本实验采用的是MFC架构,在MFC中嵌入MMX代码进行图像的相关的处理。下面简单说明了简单的电子相册需求以及技术实现:1、 打开文件,添加图片2、 在客户区显示客户选择的图片的渐变效果在实现的过程中,按照MFC单文档架构,添加一个计时器,定时从文档中得到要显示的位图数据,并显示在客户区域中。下面给出详细的实验步骤及相关的代码。(

5、1) 建立MFC单文档工程SSE4(2) 添加位图读取的相关的函数库。本实验在实验的过程中,读取BMP文件的代码是清华出版社和北京交通大学出版社出版的杨淑莹老师的VC+图像处理程序设计这本书中的的CDib函数库,主要的功能有:TCHAR* GetFileName(); /得到位图文件的名称 BOOL IsValid(); DWORD GetSize(); /得到位图的大小 UINT GetWidth(); /得到位图的宽度 UINT GetHeight(); /得到位图的高度 UINT GetNumberOfColors(); RGBQUAD* GetRGB(); BYTE* GetData(

6、); /得到位图的像素数据 BITMAPINFO* GetInfo();WORD PaletteSize(LPBYTE lpDIB); /得到调色板的大小WORD DIBNumColors(LPBYTE lpDIB);voidSaveFile(constCString filename);voidLoadFile(const TCHAR* dibFileName);/加载位图文件在本实验中用到的主要的功能是以上注释出来的代码。另外在使用的过程中,由于我使用的特殊性,存在内存泄露的情况,我根据实际的情况对相关的代码做出了修改,下面给我我对CDib代码的修改:voidCDib:LoadFile(c

7、onst TCHAR* dibFileName)if(pDib)GlobalFreePtr(pDib);在多次加载文件时候,一直开辟内存空间,但是在源代码中并没有给出释放内存的相关的操作,所以我就在源代码的里面加入了释放内存的操作。(3) 添加相关的全局变量在SSE4DOC.h中定义变量:list photos; /文件打开对话框,用来存储相关位图的文件名intm_nCurrentFade; /当前的渐变因子listm_photos_Data;/文件名称对应的像素数据list:iterator it_data,next_photo_data;/像素数据进行遍历的迭代器CDib *dib_r;

8、/给VIEW返回的要显示的位图数据(4) 添加相关的函数操作以及消息在SSE4Doc类中添加打开菜单项的响应函数OnFileOpen():void CSSE4Doc:OnFileOpen()/ TODO:在这里添加代码CFileDialogcfdlg(TRUE ,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT |OFN_ALLOWMULTISELECT|OFN_ENABLESIZING,NULL,NULL);DWORD MAXFILE=4000;cfdlg.m_ofn.nMaxFile=MAXFILE;TCHAR* pc=new TCHARMA

9、XFILE;cfdlg.m_ofn.lpstrFile=pc;cfdlg.m_ofn.lpstrFile0=NULL;cfdlg.m_ofn.lpstrFilter=_T(bmp File0*.bmp0BMP File0*.BMP0);if (cfdlg.DoModal()=IDOK)POSITION pos=cfdlg.GetStartPosition();if(!photos.empty()photos.clear();while(pos!=NULL)photos.push_back(cfdlg.GetNextPathName(pos);通过该函数可以得到相册要显示的文件的名称,填充的是变

10、量list photos .得到文件名称,接下来要做的就是讲对应的位图文件数据加载到内存中,void LoadAllFile()void CSSE4Doc:LoadAllFile(/*CDib dib*/)list:iterator it;list:iterator it_data;CDib* dib=newCDib();TCHAR tempMAX_PATH;if (!m_photos_Data.empty()m_photos_Data.clear();for (int i=0;i LoadFile(temp);delete dib;将得到的数据文件存储在变量listm_photos_Data

11、中。在VIEW中添加Timer,使得定时刷新显示的客户区域,得到图像最终的渐变效果。设置Timer在OnDraw()函数中,该函数的主要作用是在DOC类中得到处理的数据,并将处理后的位图数据显示在客户区里面。void CSSE4View:OnDraw(CDC* pDC)CSSE4Doc* pDoc =GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;/ TODO: 在此处为本机数据添加绘制代码CDib* dib=pDoc-GetDib();if(dib)BYTE *pdata=dib-GetData();if(dib-GetRGB()CPale

12、tte* p=CreateBitmapPalette(dib);CPalette* old=pDC-SelectPalette(p,TRUE);pDC-RealizePalette();StretchDIBits(pDC-GetSafeHdc(),0,0,100,100,0,0,100,100,dib-GetData(),dib-GetInfo(),DIB_RGB_COLORS,SRCCOPY);pDC-SelectPalette(old,TRUE);DeleteObject(p);elseStretchDIBits(pDC-GetSafeHdc(),0,0,dib-GetWidth(),di

13、b-GetHeight(),0,0,dib-GetWidth(),dib-GetHeight(),dib-GetData(),dib-GetInfo(),DIB_RGB_COLORS,SRCCOPY);TRACE(_T(这里执行的是绘图的函数);elseHBITMAP *hBitmap; /定义位图对象句柄BITMAP BM;CDC MemDC;CClientDCClientDC(this);MemDC.CreateCompatibleDC(&ClientDC);hBitmap=(HBITMAP*): LoadImage ( AfxGetInstanceHandle(), /取得应用程序句柄_T(init.bmp), /位图文件名IMAGE_BITMAP, /类型为Windows位图0,0, LR_LOADFROMFILE); /从文件中取位图数据MemDC.SelectObj

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号