《多媒体技术》实验报告图像变换动画

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《多媒体技术》实验报告图像变换动画
///////////大学学生实验报告实验课程名称多媒体技术开课实
验室学院学生姓名学号开课时间20XX至20XX学年第一学期总成绩
教师签名软件学院制《多媒体技术》实验报告开课实验室:
2015年X月X日学院年级、专业、班姓名成绩课程名称多媒体
技术实验项目名称图像变换动画指导教师教师评语教师签名:年月日一、实验目的通过两幅图像的变换,实现动画效果。

二、实验原理变形动画将一幅图像动态变换为另一幅大小相同、结构相似的图像。

其中需要在两幅图像的主体结构中标注对应的变
换点,在变换过程中按照对应点进行形状结构的变换。

如果不考虑图像形状结构的变换,则可简单地实现将一幅图像动态变换为另一幅大小相同的图像。

其对应变换点就以对应的像素点
确定。

本实验即按照该方式实现。

对于大小不一样的图像需要更复杂的处理方式。

需要一定的插值算法生成图像变换所产生的额外的像素值。

最终效果因算法的不同
而不同。

本实验不考虑该情形。

变换结果先以图像文件方式存储,然后可采用两种方式实现动画展示:使用构造GIF动画的软件将变换过程的图像连接成GIF动画;
自行编制软件按照一定的速度打开并展示变换过程的图像,形成动画展示效果。

理论上对于不同格式的图像文件均可以实现图像变换动画。

这里为了简化操作,统一使用BMP格式的图像文件。

对于24位真彩色BMP图像构造图像变换动画,主要就是对于图
像数据阵列中的各对应像素点的RGB值进行插值变换,实现将一幅
图像中的像素点的RGB值变换为另一幅图像中对应像素点的RGB值。

对于使用调色板的BMP索引图像,生成图像变换动画的过程稍稍复杂。

其变换方式有三种:(1)保持调色板不变,对于像素点进行
颜色变换。

将一个像素点变换为其对应的像素点时,根据该像素点
索引值所指向的调色板表项的RGB和其对应的像素点索引值所指向
的调色板表项的RGB,计算其变换图像的RGB值,然后在调色板中
查找与变换过程图像的RGB值最接近的表项,将其对应的索引值作
为变换过程图像的像素索引值。

该方式不改变原始调色板,但需要
将变换过程RGB值映射为调色板中最接近的表项;
(2)允许改变调色板,对于像素点进行颜色变换。

根据变换图
像各像素点的索引值找到其对应的调色板表项,从而获取各像素点
的RGB值。

然后按照与24位真彩色BMP图像变换相似的方式,通过
插值计算变换过程图像各像素点的RGB值。

该方式将可能在变换过
程图像中生成超过256种RGB组合的颜色。

如果再采用索引图像方
式存储该图像,则需要自行构造新的调色板,并将变换过程图像各
像素点的RGB值映射到调色板中的表项;
(3)保持调色板不变,对于像素点进行索引值变换。

即,对于
变换图像像素点的索引值,通过插值计算变换过程图像的索引值,
实现简单的图像变换。

上述三种图像变换方式中,第三种难以实现平滑的图像颜色变换,效果较差;
第二种实现过程较为复杂,需要自行生成新的调色板;
第一种最为可行。

四、实验工具VS2013五、实验步骤如果不在程序中实现图像的
打开显示和变换动画显示,可以利用控制台程序读入图像,处理后
生成各中间帧。

如果要在程序中实现图像的打开显示和变换动画显示,在这里将关键实验步骤分为c++和c#两个不同的版本叙述,提供实验方法而
不阐述具体实现步骤:
1.C#版:
C#对于图像的操作已经封装好了具体的类Bitmap,参阅资料就可以熟悉Bitmap类中所有成员函数及属性的作用,动态效果主要是利用timer控件。

1)MFC布局如下:
Time1的Enabled设置为True,Interval设置为10000ms相当于10秒
Main.cpp:usingSystem;usingSystem.Collections.Generic;usingS ponentModel;usingSystem.Data;usingSystem.Drawing;u singSystem.Linq;usingSystem.Text;usingSystem.Threading.Task s;usingSystem.Windows.Forms;namespaceanimation{publicpartia lclassForm1:Form{publicBitmapcurBitmap;BitmapsouBitmap;Bitm aporiBitmap;publicForm1(){InitializeComponent();}privatevoi dForm1_Load(objectsender,EventArgse){}privatevoidbutton1_Cl ick(objectsender,EventArgse){OpenFileDialogfileDialog=newOp enFileDialo g();timer1.Stop();fileDialog.Title=“选择文件“;fileDialog.Filter=“bmpfiles(*.bmp)|*.bmp“;fileDialog.F ilterIndex=1;fileDialog.RestoreDirectory=true;if(fileDialog .ShowDialog()==DialogResult.OK){stringfileName=fileDialog.F ileName;stringname=fileName.Substring(stIndexOf(“\\
“)+1);oriBitmap=newBitmap(fileName);pictureBox1.Image=oriB itmap;curBitmap=newBitmap(fileName);intbitmapHeight=oriBitm ap.Height;intbitmapWidth=oriBitmap.Width;}}privatevoidbutto n2_Click(objectsender,EventArgse){OpenFileDialogfileDialog= n ewOpenFileDialog();timer1.Stop();fileDialog.Title=“选择文件
“;fileDialog.Filter=“bmpfiles(*.bmp)|*.bmp“;fileDialog.F ilterIndex=1;fileDialog.RestoreDirectory=true;if(fileDialog .ShowDialog()==DialogResult.OK){stringfileName=fileDialog.F ileName;oriBitmap=newBitmap(fileName);souBitmap=newBitmap(f ileName);pictureBox2.Image=oriBitmap;}}privatevoidtimer1_Ti ck(objectsender,EventArgse){if(curBitmap!=null){curBitmap=(
Bitmap)pictureBox1.Image;Rectanglerect=newRectangle(0,0,cur Bitmap.Width,curBitmap.Height);Rectanglerect1=newRectangle( 0,0,souBitmap.Width,souBitmap.Height);System.Drawing.Imagin g.BitmapDatabmpData=curBitmap.LockBits(rect,System.Drawing. Imaging.ImageLockMode.ReadWrite,curBitmap.PixelFormat);Syst em.Drawing.Imaging.BitmapDatabmpData1=souBitmap.LockBits(re ct1,System.Drawing.Imaging.ImageLockMode.ReadWrite,souBitma p.PixelFormat);//得到首地址
IntPtrptr=bmpData.Scan0;IntPtrptr1=bmpData1.Scan0;//24位BMP位图字节
intbytes=curBitmap.Width*curBitmap.Height*3;intbytes1=curBi tmap.Width*curBitmap.Height*3;//定义位图数组
byte[]rgbValues=newbyte[bytes];byte[]rgbValues1=newbyte[byt es1];//复制被锁定的位图像素值到该数组内
System.Runtime.InteropServices.Marshal.Copy(ptr,rgbValues,0 ,bytes);System.Runtime.InteropServices.Marshal.Copy(ptr1,rg bValues1,0,bytes1);//灰度化
//doublecolorTemp=0;for(inti=0;i<rgbValues.Length;i+=3){Byt eincre1=(byte)Math.Abs(rgbValues1[i]-
rgbValues[i]);Byteincre2=(byte)Math.Abs(rgbValues1[i+1]-rgbValues[i+1]);Byteincre3=(byte)Math.Abs(rgbValues1[i+2]-rgbValues[i+2]);rgbValues[i]+=incre1;rgbValues[i+1]+=incre2 ;rgbValues[i+2]+=incre3;}//把数组复制回位图
System.Runtime.InteropServices.Marshal.Copy(rgbValues,0,ptr ,bytes);System.Runtime.InteropServices.Marshal.Copy(rgbValu es1,0,ptr1,bytes1);//解锁位图像素
curBitmap.UnlockBits(bmpData);souBitmap.UnlockBits(bmpData1 );pictureBox1.Image=curBitmap;}}privatevoidbutton3_Click(ob jectsender,EventArgse){timer1.Start();}}}六、实验结果及分析通过多媒体实验熟悉了C#编程的简单界面操作。

相关文档
最新文档