基于MMX技术电子相册.docx
- 文档编号:3174069
- 上传时间:2022-11-18
- 格式:DOCX
- 页数:13
- 大小:1.25MB
基于MMX技术电子相册.docx
《基于MMX技术电子相册.docx》由会员分享,可在线阅读,更多相关《基于MMX技术电子相册.docx(13页珍藏版)》请在冰豆网上搜索。
基于MMX技术电子相册
基于MMX技术电子相册
[键入公司名称]
[键入文档标题]
Administrator
2014/12/31
专业:
软件工程
班级:
姓名:
学号:
计算机体系结构MMX实验
一、实验目的及要求
了解并学习Inter微处理器的MMX/SSE相关的技术,用相关的技术,混合其他的编程语言对图像或者是视频进行处理。
本实验的目的是通过MMX技术对图形的处理的强大的计算功能,实现图片的渐变,最终利用MMX技术实现一个简易的电子相册应用。
二、实验环境
本实验的实验的软件环境:
操作系统:
Windows764bitsSP1旗舰版
开发IDE:
visualstudio2010旗舰版
硬件开发环境为LenovoIdeaPadY560
处理器:
Inter(R)Core(TM)i5CPUM480@2.67GHz2.67GHz
RAM:
8G
三、实验内容与步骤
1、MMX技术
MMX是MultiMediaeXtensions(多媒体扩展)的缩写,是为了方便处理大量计算的视频、音频等多媒体数据,特地在CPU中加入的专门用来进行多媒体处理的多媒体数据处理指令MMX。
MMXCPU极大地提高了电脑的多媒体(如立体声、视频、三维动画等)处理功能。
MMX技术是继Intel386(TM)处理器(将体系结构扩展至32位)之后对Intel体系结构的最重要的加强。
MMX技术的基础是一项称为单指令、多数据(SIMD)的技术。
它使得许多条信息可由一条单一指令来处理,这种平行操作使性能得以大幅度地提高。
MMX技术随着出现后就以后再发展着,目前已经到了SSE指令集。
在MMX到SSE之间本质是一样的,只是不用的是指令功能的增强和指令数目的增加,使得我们在处理计算密集型的数据时候更够节省更多的时间。
以下就简单介绍下MMX/SSE相关的指令及其优点。
MMX技术的基础是一项称为单指令、多数据(SIMD)的技术。
它使得许多条信息可由一条单一指令来处理,这种平行操作使性能得以大幅度地提高。
MMX基本的指令集有拷贝指令、运算指令、分组指令。
MOVQ:
64位数据拷贝
MOVD:
32位数据拷贝
PUNPCKLBW/PUNPCKLWD/PUNPCKLDQ:
将寄存器的32位数据交错组合为64位的数据
PACKUSWB:
将16位的数据转换为无符号的8位数据
PACKSSWB/PACKSSDW:
将32/16位数据转化为16/8位数据
PADDB/W/D:
加法的运算
PASUB/W/D:
减法运算等
2、实验步骤及相关代码
本实验采用的是MFC架构,在MFC中嵌入MMX代码进行图像的相关的处理。
下面简单说明了简单的电子相册需求以及技术实现:
1、打开文件,添加图片
2、在客户区显示客户选择的图片的渐变效果
在实现的过程中,按照MFC单文档架构,添加一个计时器,定时从文档中得到要显示的位图数据,并显示在客户区域中。
下面给出详细的实验步骤及相关的代码。
(1)建立MFC单文档工程SSE4
(2)添加位图读取的相关的函数库。
本实验在实验的过程中,读取BMP文件的代码是清华出版社和北京交通大学出版社出版的杨淑莹老师的《VC++图像处理程序设计》这本书中的的CDib函数库,主要的功能有:
TCHAR*GetFileName();//得到位图文件的名称
BOOLIsValid();
DWORDGetSize();//得到位图的大小
UINTGetWidth();//得到位图的宽度
UINTGetHeight();//得到位图的高度
UINTGetNumberOfColors();
RGBQUAD*GetRGB();
BYTE*GetData();//得到位图的像素数据
BITMAPINFO*GetInfo();
WORDPaletteSize(LPBYTElpDIB);//得到调色板的大小
WORDDIBNumColors(LPBYTElpDIB);
voidSaveFile(constCStringfilename);
voidLoadFile(constTCHAR*dibFileName);//加载位图文件
在本实验中用到的主要的功能是以上注释出来的代码。
另外在使用的过程中,由于我使用的特殊性,存在内存泄露的情况,我根据实际的情况对相关的代码做出了修改,下面给我我对CDib代码的修改:
voidCDib:
:
LoadFile(constTCHAR*dibFileName)
{
……
if(pDib)
GlobalFreePtr(pDib);
……
}
在多次加载文件时候,一直开辟内存空间,但是在源代码中并没有给出释放内存的相关的操作,所以我就在源代码的里面加入了释放内存的操作。
(3)添加相关的全局变量
在SSE4DOC.h中定义变量:
list
intm_nCurrentFade;//当前的渐变因子
list
list
:
iteratorit_data,next_photo_data;//像素数据进行遍历的迭代器
CDib*dib_r;//给VIEW返回的要显示的位图数据
(4)添加相关的函数操作以及消息
在SSE4Doc类中添加打开菜单项的响应函数OnFileOpen():
voidCSSE4Doc:
:
OnFileOpen()
{
//TODO:
在这里添加代码
CFileDialogcfdlg(TRUE,\
NULL,\
NULL,\
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT|OFN_ENABLESIZING,\
NULL,\
NULL);
DWORDMAXFILE=4000;
cfdlg.m_ofn.nMaxFile=MAXFILE;
TCHAR*pc=newTCHAR[MAXFILE];
cfdlg.m_ofn.lpstrFile=pc;
cfdlg.m_ofn.lpstrFile[0]=NULL;
cfdlg.m_ofn.lpstrFilter=_T("bmpFile\0*.bmp\0BMPFile\0*.BMP\0");
if(cfdlg.DoModal()==IDOK)
{
POSITIONpos=cfdlg.GetStartPosition();
if(!
photos.empty())
photos.clear();
while(pos!
=NULL)
{
photos.push_back(cfdlg.GetNextPathName(pos));
}
}
通过该函数可以得到相册要显示的文件的名称,填充的是变量list
得到文件名称,接下来要做的就是讲对应的位图文件数据加载到内存中,voidLoadAllFile()
voidCSSE4Doc:
:
LoadAllFile(/*CDibdib*/)
{
list
:
iteratorit;
list
:
iteratorit_data;
CDib*dib=newCDib();
TCHARtemp[MAX_PATH];
if(!
m_photos_Data.empty())
{
m_photos_Data.clear();
}
for(inti=0;i { m_photos_Data.push_back(*dib); } for(it=photos.begin(),it_data=m_photos_Data.begin();it! =photos.end();++it,it_data++) { lstrcpy(temp,*it); it_data->LoadFile(temp); } deletedib; } 将得到的数据文件存储在变量list 在VIEW中添加Timer,使得定时刷新显示的客户区域,得到图像最终的渐变效果。 设置Timer在OnDraw()函数中,该函数的主要作用是在DOC类中得到处理的数据,并将处理后的位图数据显示在客户区里面。 voidCSSE4View: : 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()) { CPalette*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); } else { StretchDIBits(pDC->GetSafeHdc(),0,0,dib->GetWidth(),dib->GetHeight(),0,0,dib->GetWidth(),dib->GetHeight(),dib->GetData(),dib->GetInfo(),DIB_RGB_COLORS,SRCCOPY); TRACE(_T("这里执行的是绘图的函数")); } }else { HBITMAP*hBitmap;//定义位图对象句柄 BITMAPBM; CDCMemDC; CClientDCClientDC(this); MemDC.CreateCompatibleDC(&ClientDC); hBitmap=(HBITMAP*): : LoadImage(AfxGetInstanceHandle(),//取得应用程序句柄 _T("init.bmp"),//位图文件名 IMAGE_BITMAP,//类型为Windows位图 0,0,LR_LOADFROMFILE);//从文件中取位图数据 MemDC.SelectObject(hBitmap); : : GetObject(hBitmap,sizeof(BM),&BM); ClientDC.BitBlt(200,80,//目标设备逻辑横、纵坐标 BM.bmWidth,BM.bmHeight,//显示位图的像素宽、高度 &MemDC,//待显示位图数据的设备情境对象 0,0,//源数据中的横、纵坐标 SRCCOPY);//位操作方式 SetTimer(1,10,NUL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 MMX 技术 电子相册