基于MMX技术电子相册Word下载.docx

上传人:b****2 文档编号:16084993 上传时间:2022-11-18 格式:DOCX 页数:13 大小:1.25MB
下载 相关 举报
基于MMX技术电子相册Word下载.docx_第1页
第1页 / 共13页
基于MMX技术电子相册Word下载.docx_第2页
第2页 / 共13页
基于MMX技术电子相册Word下载.docx_第3页
第3页 / 共13页
基于MMX技术电子相册Word下载.docx_第4页
第4页 / 共13页
基于MMX技术电子相册Word下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

基于MMX技术电子相册Word下载.docx

《基于MMX技术电子相册Word下载.docx》由会员分享,可在线阅读,更多相关《基于MMX技术电子相册Word下载.docx(13页珍藏版)》请在冰豆网上搜索。

基于MMX技术电子相册Word下载.docx

硬件开发环境为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基本的指令集有拷贝指令、运算指令、分组指令。

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<

CString>

photos;

//文件打开对话框,用来存储相关位图的文件名

intm_nCurrentFade;

//当前的渐变因子

CDib>

m_photos_Data;

//文件名称对应的像素数据

iteratorit_data,next_photo_data;

//像素数据进行遍历的迭代器

CDib*dib_r;

//给VIEW返回的要显示的位图数据

(4)添加相关的函数操作以及消息

在SSE4Doc类中添加打开菜单项的响应函数OnFileOpen():

voidCSSE4Doc:

OnFileOpen()

//TODO:

在这里添加代码

CFileDialogcfdlg(TRUE,\

NULL,\

OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT|OFN_ENABLESIZING,\

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<

photos.

得到文件名称,接下来要做的就是讲对应的位图文件数据加载到内存中,voidLoadAllFile()

LoadAllFile(/*CDibdib*/)

list<

iteratorit;

iteratorit_data;

CDib*dib=newCDib();

TCHARtemp[MAX_PATH];

if(!

m_photos_Data.empty())

m_photos_Data.clear();

for(inti=0;

i<

photos.size();

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<

m_photos_Data中。

在VIEW中添加Timer,使得定时刷新显示的客户区域,得到图像最终的渐变效果。

设置Timer在OnDraw()函数中,该函数的主要作用是在DOC类中得到处理的数据,并将处理后的位图数据显示在客户区里面。

voidCSSE4View:

OnDraw(CDC*pDC)

CSSE4Doc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

pDoc)

return;

在此处为本机数据添加绘制代码

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);

SelectPalette(old,TRUE);

DeleteObject(p);

else

StretchDIBits(pDC->

GetSafeHdc(),0,0,dib->

GetWidth(),dib->

GetHeight(),0,0,dib->

GetHeight(),dib->

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1