用C#设计个性化动画屏保程序

时间:2022-10-21 06:44:54

用C#设计个性化动画屏保程序

摘要:随着计算机显示器质量的提高,屏保程序保护显示器的功能已淡化,更多时间被用来当作艺术品欣赏。该文介绍了用C#设计个性化动画屏保程序的基本过程,其中重点介绍了动画效果的实现方法。

关键词:C#;屏保程序;动画

中图分类号:TP37文献标识码:A文章编号:1009-3044(2011)16-3940-03

The Designing of Personalized Animation Screensaver by C#

LIU De-qiang

(Wuxi Institute of Technology, Wuxi 214121, China)

Abstract: With the improvement of quality of computer monitor, screensaver is now often used as art appreciation instead of protecting monitor. This article describes the basic designing processes of personalized animation screensaver using c#, which focuses on the realization of animation effects.

Key words: C#;screensaver;animation

设计屏保程序的初衷是保护CRT显示器,程序运行时产生的动态画面可以避免因电子束长时间轰击显示器某一处造成对显示器荧光粉的伤害。随着计算机显示器质量的提高,屏保程序的上述功能已变得不再重要,更多时间被用来当作艺术品欣赏和展示,成为张扬个性、展露心境的工具。制作屏保程序的软件很多,使用C#设计屏保程序简单易学,且设计好的程序稍作改动便可用于表现不同的主题,更适用于追求个性化的需求。

1 素材收集和加工

使用C#设计个性化动画屏保程序,需要用到两种后台资源文件,一种是JPG格式的图像文件,另一种是相互关联的序列动画帧文件。随着计算机网络技术的发展和网络用户的不断增加,网络资源已越来越丰富。对于上述两种资源文件,当设计屏保程序所要表现的主题确定以后,可充分利用网络丰富的开放资源,使用搜索引擎进行相关素材的搜索和收集。JPG格式的图像文件在程序中用作动画背景,以衬托主题,收集时一要注意内容与主题贴近,二要保证图像尺寸不小于800*600像素,以保证图像全屏显示时的清晰度。序列动画帧文件在程序中通过依序显示实现动画效果,网络上通常只能搜索到GIF格式的动画文件,需要进行再加工,转换成动画帧文件后才能使用。收集时要选择背景透明的动画。对于上述两种资源文件,有条件的也可以使用相关软件自行制作,以追求个性的极致化。

C#中的PictureBox控件虽然支持GIF格式动画文件的直接播放,但播放的同时如果重新设置图像在控件中的播放位置,会产生屏闪现象,影响动画效果,因此对于收集的GIF格式的动画文件,应先转换成序列动画帧文件。转换工作可使用图像处理软件ImageReady来实现,具体操作方法是:运行ImageReady,通过“文件”菜单中的“打开”命令打开要转换的动画文件,这时ImageReady环境窗口中将会同时显示原始动画文件图像和构成该动画文件的序列帧图像,序列帧图像展开后的效果如图1所示。接下来的工作是保存序列帧图像,通过“文件”菜单中的“导出”项,执行“动画帧作为文件”命令,命名文件,设置保存路径,单击“好”按钮即可。

图1 构成动画的帧序列

2 程序设计和动画效果实现

用C#设计屏保程序,作者采用的方法是先设计C#项目程序,设计和调试完成后,再转换成屏保程序。项目程序设计分成两步:先界面设计,再程序代码设计。

界面设计时需要用到的控件有三个,一个是图片框控件PictureBox,另两个是定时器控件Timer。图片框控件在程序中的作用是显示背景图像和动画帧图像,两个定时器控件在程序中一个用于设置动画帧图像位置发生改变的时间间隔,另一个用于设置相邻两个动画帧图像显示的时间间隔。图片框控件的BackgroundImageLayout属性应设置为 Stretch,以使不同尺寸背景图像都能全屏显示,考虑到所设计程序将来能用于不同主题,图片框控件的其它属性在设计界面时可不进行设置,留待代码中完成。而两个定时器控件的Interval属性可以根据当前选择的动画文件所表现的动作方式和构成该动画文件的动画帧的个数进行初步设置,通常为100ms级。鉴于所设计程序将来要转换成屏保程序,设计界面时,还需对窗体的相关属性进行设置。WindowState属性设置为Maximized,以保证程序运行时窗体最大化;FormBorderStyle属性设置为None,程序运行时将不再显示标题栏和任务栏;TopMost属性设置为True,使该窗体在有多个窗体同时显示的情况下能成为当前窗体,被显示在电脑桌面的最前端。

程序代码设计要实现的主要功能是显示背景图像和动画帧图像,其中关键的是要通过两个定时器控件使静态的序列动画帧图像在显示过程中产生动画效果。为使程序方便移植和转换,设计代码前应先将上文中所述的两种资源文件复制到项目程序所在目录的debug子目录中。

设计时,先在窗体类中定义两个Bitmap对象成员,并分别初始化为debug子目录中的背景图像和序列动画帧图像中的第一帧图像,定义语句如下:

private Bitmap bitmap_bg = new Bitmap("bgimage.jpg");

private Bitmap bitmap_am = new Bitmap("amimage_1.gif");

在窗体类中还需要定义两个整形数据成员x和y,用于设置帧图像的初始位置。

在窗体的Load事件函数中,对图片框控件PictureBox的相关属性进行设置:

pictureBox1.BackgroundImage = bitmap_bg;//显示背景图像

pictureBox1.Width = this.Width; //使图片框和窗体等宽

pictureBox1.Height = this.Height; //使图片框和窗体等高

动画屏保程序的动画效果主要通过图像的运动和变化两种形式来体现。使静止图像产生连续运动和变化效果是利用人眼的视觉暂留效应,当以较快的速度播放相关连的序列画面时,人眼所观察到的动作变化就是连续的,同理当静止图像以较短的时间间隔连续进行较小的位移,人眼所观察到的运动也是连续的。

程序中,图像的连续运动可直接通过定时器控件的Tick事件来实现,设计时只要将改变图像位置的代码语句置于Tick事件函数中即可。程序运行时,定时器控件按照Interval属性设置的时间间隔周期性触发Tick事件,实现图像位置的不断改变,而由于Interval属性值通常仅为100ms级,图像位置这种快速的不断改变反映到人眼中将变成连续的运动。关于图像位置改变语句,如果图像是直线和等距运动,只要在语句中对坐标值进行常量的加减即可,如果图像运动方向和距离是不确定的,则需要定义Random对象,通过该对象生成随机数,然后再和原坐标值进行加减。

和图像的连续运动不同,图像的连续变化要间接通过定时器控件的Tick事件来实现,原因是,在播放序列帧图像过程中需要进行图像的“重画”,即显示下一帧图像的同时要隐藏上一帧图像,而这种“重画”功能需要通过图片框控件的Paint事件来实现。因此编写程序代码时,用于显示帧图像的语句应写在图片框控件的Paint事件函数中,然后在定时器控件的Tick事件函数中调用Paint事件函数。

Paint事件函数中采用分支结构编写显示帧图像的语句,分支数与图像帧数相同,一个分支显示帧图像序列中的一帧;各分支的执行通过一整形数据成员控制,整形数据成员值在和图像帧数相对应的区间内周期变化。Paint事件函数中的部分代码如下:

if (i == 7)

{i = 0;

}

if (i == 0) //在指定位置,以指定大小显示第一帧

{bitmap_am = new Bitmap("amimage_1.gif");

e.Graphics.DrawImage(bitmap_am, x, y, w, h);

}

if(I == 1) //在指定位置,以指定大小显示第二帧

{bitmap_am = new Bitmap("amimage_2.gif");

e.Graphics.DrawImage(bitmap_am, x, y, w, h);

}

……

i++;

上述代码中,x、y参数确定图像位置,其值由上文中所述的图像位置改变语句确定;w、h参数确定图像的宽度和高度。对于图像连续变化,但大小不变的动画效果,w、h参数只需取帧图像原始尺寸值即可;如果要同时实现图像有远近变化的效果,代码中应增加对两参数值进行递增或递减的语句,且两参数递增或递减值的比例应和原始尺寸中宽和高的比例相同。

定时器控件调用Paint事件函数的语句如下:

pictureBox1.Invalidate();

程序运行时,定时器控件按照Interval属性设置的时间间隔周期性触发Tick事件,进而间接地周期性调用Paint事件函数。函数在周期性调用过程中,依次显示和隐藏序列帧图片中的各帧,而由于Interval属性值通常仅为100ms级,图像的这种快速切换反映到人眼中将变成连续的动作变化。

3 程序调试

要使程序所产生的动画效果形象而逼真,设计完成后,还必须对程序中的相关参数进行反复细致的调整。程序中与动画效果紧密相关的参数有四个,分别是:动画帧图像每次移动的距离、移动的时间间隔、“重画”的时间间隔和“重画”时图像尺寸的缩放值。四个参数对动画效果的影响是相互关联的,调整时可先以现实世界中动作变化的频率为基础,先调试重画时间间隔,然后再以动作变化的幅度为依据,参照背景图像相比真实环境的缩放比例,对距离和移动时间间隔参数进行联动调试,最后再结合前两者,依据图像的垂直坐标的变化对缩放值参数进行调试。程序调试是一个复杂的过程,调试时,参数值的改变不宜一次调整过大,应遵循“调整-观察-再调整”的步骤反复进行,直至达到满意的视觉效果为止。

4 项目程序转换为屏保程序

项目程序只能在VS环境下运行,调试完成后,应转换成屏保程序。具体方法是:打开项目程序的debug子目录,将目录中与项目程序同名的.exe文件复制到目标计算机系统盘的system32文件夹中,并将文件的后缀名改为.scr,原项目程序用到的背景图像文件和动画帧文件也应同时复制到system32文件夹中。C#项目程序转换成屏保程序以后,其启用方法和windows预置的屏保程序的启用方法相同。需要说明的是:运行C#设计的屏保程序,目标机器上需要安装相应版本的.NET Framework。

5 结束语

设计C#动画屏保程序,采用通过代码加载图片的方法,对资源和程序实现了有效分离,所设计的程序可方便地应用于不同的动画主题。只要将程序debug子目录中的相关图像文件替换成其它主题所用的图像文件,然后根据新的帧图像文件数,对程序中分支结构语句的分支数进行增删,再对相关参数进行必要调整即可。程序的这种特点更易于满足个性化的需求。

参考文献:

[1] 刘培林.C#可视化程序设计案例教程[M].北京:机械工业出版社,2009.

[2] 聂黎生.VB动画设计原理及其实现[J].电脑学习,2006(10).

[3] 徐春华.J2ME时钟动画屏保的设计与实现[J].电脑编程技巧与维护,2010(18).

[4] 王道才.在线制作漂亮的屏保[J].电脑知识与技术:经验技巧,2008(5).

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文

上一篇:物流配送与运输企业业务处理系统设计 下一篇:浅析新闻网站编辑发稿统计解决方案