中南大学多媒体实验一.docx
- 文档编号:5662535
- 上传时间:2022-12-30
- 格式:DOCX
- 页数:14
- 大小:1.23MB
中南大学多媒体实验一.docx
《中南大学多媒体实验一.docx》由会员分享,可在线阅读,更多相关《中南大学多媒体实验一.docx(14页珍藏版)》请在冰豆网上搜索。
中南大学多媒体实验一
《多媒体原理与系统设计》
实验报告
项目名称实验一
专业班级软件1203
学号
姓名
实验成绩:
批阅教师:
2014年11月19日
实验1《数字图像处理程序设计》
实验学时:
2实验地点:
二综203实验日期:
2014/11/19
一、实验目的
1.强化对BMP位图数据格式的理解
2.掌握数字图像数据的基本操作方法(像素级)
3.理解图像融合的基本原理
4.提高VC++图像处理程序设计能力
二、实验内容和方法
1.向内存加载两个或多个BMP位图文件
2.利用像素操作实现单色(R、G、B)、灰度图像的显示
3.通过操作像素实现图像的倒立和正立显示
4.实现两个图像的叠加(透明性原理,可见水印原理)
5.通过像素操作处理图像扭曲问题(即当图像的每行像素个数不能被4整除时的填充字节问题)。
三、实验要求
1.实验前预习BMP位图文件数据格式
2.准备两个分辨率相同但内容不同的BMP位图文件(24位)
3.熟悉教师提供的框架性代码(仅含打开文件、数据定位等基本功能)
4.独立完成各项实验任务
5.做好实验记录(保存各类实验的输出图像)
四、实验步骤
1.启动VC++编程环境
2.打开框架性解决方案文件
3.编写关键代码
4.运行程序
5.验收
五、实验结果
主
程序代码:
#include"stdafx.h"
#include"waterRipple.h"
#defineMAX_LOADSTRING100
//////////////////////////
#defineIMAGE_WIDTH640
#defineIMAGE_HIGHT480
typedefstructCOLOR{
BYTEb;
BYTEg;
BYTEr;
}RGBCOLOR;
//全¨?
局?
变À?
量¢?
:
HINSTANCEhInst;//当Ì¡À前¡ã实º¦Ì例¤y
TCHARszTitle[MAX_LOADSTRING];//标À¨º题¬a栏¤?
文?
本À?
TCHARszWindowClass[MAX_LOADSTRING];//主¡Â窗ä¡ã口¨²类¤¨¤名?
voidNextFrameWaveEnerge();
voidRenderRipple();
voiddisturb();
///////////////////////////////////////////////////
//
/*
1.高?
度¨¨和¨ª宽¨ª度¨¨颠Ì?
倒Ì1,ê?
why?
ê?
2.
*/
intstaticbuffer_1[IMAGE_HIGHT][IMAGE_WIDTH],buffer_2[IMAGE_HIGHT][IMAGE_WIDTH];
intstatictmp[IMAGE_HIGHT][IMAGE_WIDTH];//中D间?
矩?
阵¨®,ê?
用®?
于®¨²交?
换?
波¡§能¨¹
staticCOLORdet_image[IMAGE_HIGHT][IMAGE_WIDTH];//要°a显?
示º?
的Ì?
目?
标À¨º图ª?
像?
staticFILE*ifp;
staticchar*filename="1.bmp";//24位?
的Ì?
位?
图ª?
staticunsignedcharmybuf[IMAGE_HIGHT*IMAGE_WIDTH*3+100];
staticBITMAPFILEHEADER*pbmpfh;
staticBITMAPINFO*pbmpi;
staticBYTE*pBits;
staticintcxDib,cyDib;
//此ä?
代䨲码?
模¡ê块¨¦中D包㨹含?
的Ì?
函¡¥数ºy的Ì?
前¡ã向¨°声¦¨´明¡Â:
ATOMMyRegisterClass(HINSTANCEhInstance);
BOOLInitInstance(HINSTANCE,int);
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
INT_PTRCALLBACKAbout(HWND,UINT,WPARAM,LPARAM);
intAPIENTRY_tWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPTSTRlpCmdLine,
intnCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
//TODO:
在¨²此ä?
放¤?
置?
代䨲码?
。
¡ê
////////////////////////
//
for(inty=0;y for(intx=0;x buffer_1[y][x]=0; buffer_2[y][x]=0; } } ifp=fopen(filename,"r"); fread(mybuf,925696,1,ifp); pbmpfh=(BITMAPFILEHEADER*)mybuf; pbmpi=(BITMAPINFO*)(pbmpfh+1); pBits=(BYTE*)pbmpfh+pbmpfh->bfOffBits; cxDib=pbmpi->bmiHeader.biWidth; cyDib=pbmpi->bmiHeader.biHeight; MSGmsg; HACCELhAccelTable; //初? 始º? 化¡¥全¨? 局? 字Á? 符¤? 串ä? LoadString(hInstance,IDS_APP_TITLE,szTitle,MAX_LOADSTRING); LoadString(hInstance,IDC_WATERRIPPLE,szWindowClass,MAX_LOADSTRING); MyRegisterClass(hInstance); //执¡ä行D应®|用®? 程¨¬序¨°初? 始º? 化¡¥: if(! InitInstance(hInstance,nCmdShow)) { returnFALSE; } hAccelTable=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDC_WATERRIPPLE)); //主¡Â消? 息¡é循-环¡¤: while(GetMessage(&msg,NULL,0,0)) { if(! TranslateAccelerator(msg.hwnd,hAccelTable,&msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return(int)msg.wParam; } // //函¡¥数ºy: MyRegisterClass() // //目? 的Ì? : 注Á¡é册¨¢窗ä¡ã口¨²类¤¨¤。 ¡ê // //注Á¡é释º¨ª: // //仅? 当Ì¡À希¡ê望ª? //此ä? 代䨲码? 与®? 添¬¨ª加¨®到Ì? Windows95中D的Ì? “¡ãRegisterClassEx”¡À //函¡¥数ºy之? 前¡ã的Ì? Win32系¦Ì统ª3兼? 容¨Y时º¡À,ê? 才? 需¨¨要°a此ä? 函¡¥数ºy及¡ã其? 用®? 法¤¡§。 ¡ê调Ì¡Â用®? 此ä? 函¡¥数ºy十º? 分¤? 重? 要°a,ê? //这a样¨´应®|用®? 程¨¬序¨°就¨ª可¨¦以°? 获? 得Ì? 关? 联¢a的Ì? //“¡ã格? 式º? 正y确¨¡¤的Ì? ”¡À小? 图ª? 标À¨º。 ¡ê // ATOMMyRegisterClass(HINSTANCEhInstance) { WNDCLASSEXwcex; wcex.cbSize=sizeof(WNDCLASSEX); wcex.style=CS_HREDRAW|CS_VREDRAW; wcex.lpfnWndProc=WndProc; wcex.cbClsExtra=0; wcex.cbWndExtra=0; wcex.hInstance=hInstance; wcex.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_WATERRIPPLE)); wcex.hCursor=LoadCursor(NULL,IDC_ARROW); wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName=MAKEINTRESOURCE(IDC_WATERRIPPLE); wcex.lpszClassName=szWindowClass; wcex.hIconSm=LoadIcon(wcex.hInstance,MAKEINTRESOURCE(IDI_SMALL)); returnRegisterClassEx(&wcex); } // //函¡¥数ºy: InitInstance(HINSTANCE,int) // //目? 的Ì? : 保À¡ê存ä? 实º¦Ì例¤y句? 柄À¨²并¡é创ä¡ä建¡§主¡Â窗ä¡ã口¨² // //注Á¡é释º¨ª: // //在¨²此ä? 函¡¥数ºy中D,ê? 我¨°们? 在¨²全¨? 局? 变À? 量¢? 中D保À¡ê存ä? 实º¦Ì例¤y句? 柄À¨²并¡é //创ä¡ä建¡§和¨ª显? 示º? 主¡Â程¨¬序¨°窗ä¡ã口¨²。 ¡ê // BOOLInitInstance(HINSTANCEhInstance,intnCmdShow) { HWNDhWnd; hInst=hInstance;//将? 实º¦Ì例¤y句? 柄À¨²存ä? 储ä¡é在¨²全¨? 局? 变À? 量¢? 中D hWnd=CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL); if(! hWnd) { returnFALSE; } ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); ////////////////////////////////// /////////////////////// SetTimer(hWnd,ID_TIMER,10,NULL); returnTRUE; } // //函¡¥数ºy: WndProc(HWND,UINT,WPARAM,LPARAM) // //目? 的Ì? : 处ä|理¤¨ª主¡Â窗ä¡ã口¨²的Ì? 消? 息¡é。 ¡ê // //WM_COMMAND-处ä|理¤¨ª应®|用®? 程¨¬序¨°菜? 单Ì£¤ //WM_PAINT-绘? 制? 主¡Â窗ä¡ã口¨² //WM_DESTROY-发¤¡é送¨ª退ª? 出? 消? 息¡é并¡é返¤¦Ì回? // // LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam) { intwmId,wmEvent; PAINTSTRUCTps; HDChdc; switch(message) { caseWM_COMMAND: wmId=LOWORD(wParam); wmEvent=HIWORD(wParam); //分¤? 析? 菜? 单Ì£¤选? 择? : switch(wmId) { caseIDM_ABOUT: DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX),hWnd,About); break; caseIDM_EXIT: DestroyWindow(hWnd); break; default: returnDefWindowProc(hWnd,message,wParam,lParam); } break; caseWM_TIMER: hdc=GetDC(hWnd); //给? 水? 池? 一°? 个? 扰¨? 动¡¥ disturb(); //调Ì¡Â用®? 波¡§能¨¹计? 算? 函¡¥数ºy NextFrameWaveEnerge(); //调Ì¡Â用®? 渲? 染¨? 图ª? 像? 函¡¥数ºy RenderRipple(); //显? 示º? 已°? 经-渲? 染¨? 过y的Ì? 图ª? 像? SetDIBitsToDevice(hdc, 0, 0, cxDib, cyDib, 0, 0, 0, cyDib, det_image, pbmpi, DIB_RGB_COLORS); ReleaseDC(hWnd,hdc); caseWM_PAINT: hdc=BeginPaint(hWnd,&ps); //TODO: 在¨²此ä? 添¬¨ª加¨®任¨? 意°a绘? 图ª? 代䨲码? ... SetDIBitsToDevice(hdc, 0, 0, cxDib, cyDib, 0, 0, 0, cyDib, pBits, pbmpi, DIB_RGB_COLORS); EndPaint(hWnd,&ps); break; caseWM_DESTROY: PostQuitMessage(0); break; default: returnDefWindowProc(hWnd,message,wParam,lParam); } return0; } //“¡ã关? 于®¨²”¡À框¨°的Ì? 消? 息¡é处ä|理¤¨ª程¨¬序¨°。 ¡ê INT_PTRCALLBACKAbout(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam) { UNREFERENCED_PARAMETER(lParam); switch(message) { caseWM_INITDIALOG: return(INT_PTR)TRUE; caseWM_COMMAND: if(LOWORD(wParam)==IDOK||LOWORD(wParam)==IDCANCEL) { EndDialog(hDlg,LOWORD(wParam)); return(INT_PTR)TRUE; } break; } return(INT_PTR)FALSE; } voidNextFrameWaveEnerge(){ for(inty=0;y for(intx=0;x buffer_2[y][x]=((buffer_1[y][x-1]+buffer_1[y][x+1]+ buffer_1[y-1][x]+buffer_1[y+1][x])>>1)-buffer_2[y][x]; buffer_2[y][x]-=buffer_2[y][x]>>8; } for(inty=0;y for(intx=0;x tmp[y][x]=buffer_1[y][x]; for(inty=0;y for(intx=0;x buffer_1[y][x]=buffer_2[y][x]; for(inty=0;y for(intx=0;x buffer_2[y][x]=tmp[y][x]; } voidRenderRipple(){ for(inty=0;y for(intx=0;x intxcff=buffer_2[y][x-1]-buffer_2[y][x+1]; intycff=buffer_2[y-1][x]-buffer_2[y+1][x]; //±¨¤ß½ç´? ¦À§¡èí§a if(xcff>=cxDib){ xcff=cxDib-1; } if(xcff<0){ xcff=0; } if(ycff>=cyDib){ ycff=cyDib-1; } if(ycff<0){ ycff=0; } //äÖȧ¡§¾Í§a¼Ïó§? det_image[y][x].r=*(pBits+2+(x+xcff)*3+(y+ycff)*cxDib*3); det_image[y][x].g=*(pBits+1+(x+xcff)*3+(y+ycff)*cxDib*3); det_image[y][x].b=*(pBits+0+(x+xcff)*3+(y+ycff)*cxDib*3); } } voiddisturb(){ intx,y,stonesize,stoneweight; x=rand(); y=200+rand()%(540-200+1); stonesize=10; stoneweight=100; if((x>=cxDib-stonesize)||(x return; for(intposy=y-stonesize;posy for(intposx=x-stonesize;posx if((posx-x)*(posx-x)+(posy-y)*(posy-y) buffer_1[posy][posx]+=stoneweight; } } 六、实验小结 在老师的带领下基本完成了实验要求,加深了BMP位图数据格式的理解,掌握数字图像数据的基本操作方法(像素级)。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中南 大学 多媒体 实验