摘 要 本文使用一幅具有海水和云层的背景图和另一幅具有一条鱼的前景图,用改变部分背景图像透明度和前景图像旋转的方法,制作了鱼儿入水、鱼儿穿过树林和云层的具有立体感的动画。本文程序使用的语言是Java,只要稍作更改即可适用于其它语言,比如,用C++、C#改写本程序。
关键词 动画,透明度,图像旋转,Java
一、引言
动画是计算机程序中比较引人入胜的部分。通常将若干幅图像轮流显示,每幅显示几十毫秒,并依次擦除旧图重画新图。这样显示图像的方式在人的视觉中会产生连续移动的感觉。这就是动画的基本原理。
本文仅使用两幅图,一幅具有海水和云层的背景图像和另一幅前景图仅有一条鱼,使用改变部分背景图像的透明度和将前景图像旋转的方法,制作鱼儿入水(参见图1)、鱼儿穿过树林(参见图2)和鱼儿穿过云层(参见图3)的具有立体感的动画。本文程序使用的语言是Java,只要稍作更改即可适用于其它语言,比如,可用C++、C#改写本程序。事实上,本程序改变透明度部分的代码最初是用C#写的。
图1 鱼进入半透明的海水
图2 鱼在树间穿过
图3 鱼在穿过半透明的云层
二、图像处理
先介绍与本程序有关的图像处理知识。
1.在Applet中图像的载入
Java能显示的图像只有三种, 即 jpg、gif和png型图像。对于其它类型的图像要通过转换成这三种图像来显示。
在Applet中使用如下方法加载图像:
getImage(url,"figure.jpg");
其中url是图像的地址, 是URL类的对像。 URL(Uniform Resouce Locator统一资源定位器) 将全球任何一台计算机, 包括本地机的资源给出一个统一的地址。若图像文件存放在Java程序的当前目录或其子目录下, 那么, 我们可以用getCodeBase()或 getDocumentBase()来取得图像文件figure.jpg的URL。例如,
getImage(getCodeBase(),"figure.jpg");
或
getImage(getDocumentBase(),"figure.jpg");
2.MediaTracker类和图像的跟踪
当图像来自速度较慢的网络连接时,可以用MediaTracker类对图像的载入情况进行跟踪。方法的主要思想是给每个图像赋于唯一的ID号。当启动图像跟踪后,可以通过waitForID()方法等待图像加载完毕,相应代码如下:
MediaTracker mt=new MediaTracker();
Image img=getImage(name);
mt.addImage(img,0);
try{ tm.waitForID(0); }
catch(InterruptedException e){}
代码一直处于等待状态,直到图像加载完毕后才继续执行后面的代码。
若要等待所有媒体跟踪器的图像加载完毕,可使用如下代码
try{ tm.waitForIDAll(); }
catch(InterruptedException e){}
3. 图像的显示
使用如下方法在坐标(x, y)处画出图像image
g.drawImage(image, x, y, this);
如果要在坐标(x,y)处且在宽度和高度分别为width和height的矩形框内显示图像,使用如下语句
g.drawImage(image, x, y, width,
height, this);
4.建立缓冲图像BufferedImage对像
当需要对图像像素进行操作时,需要建立缓冲图像对像,其方法如下:
BufferedImage image=
new BufferedImage(width,height,pixelType);
其中width, height分别表示图像的宽度和高度。pixelType表示像素类型,通常的类型为TYPE_ INT_ARGB和TYPE_INT_RGB。若类型为TYPE_ INT_ARGB,则每个像素使用透明度(Alpha)、红(Red)、绿(Green)、蓝(Blue)来描述,每个值的范围均在0~255。透明度Alpha为0表示完全透明,255表示完全不透明。类型TYPE_INT_RGB除了没有透明度外与类型TYPE_INT_ARGB相同。
5. ImageProducer接口和MemoryImage -Source类
ImageProducer是一个用于生成图像数据对像的接口。一个实现该接口的对像将提供整数或字节类型的数组并生成Image对像。在java. awt. image类库中包含两种图像生成器:MemoryImageSource和FilteredImageSource。本文仅介绍MemoryImageSource类。其构造方法如下:
MemoryImageSource(int width, int height,
int pixel[], int offset, int scanLineWidth)
MemoryImageSource对像主要由整数数组pixel[]构造的。这些整数由图像的像素pixel确定,在默认的RGB模型中为Image对像生成数据。在默认的颜色模型中,一个像素是一个带有透明度(Alpha)、红(Red)、绿(Green)、蓝(Blue)的整数(0xAARRGGBB)。生成图像的宽度和高度由width和height决定。像素数组中最先被读出的第1个点由offset所传递。扫描线的宽(常与图像的宽相同)由参数scanLineWidth传递。用MemoryImage- Source类的对像ms作为方法createImage(ms)的参数,可以生成新的图像类对像。
|