-
各种动态图像设计方法的比较分析
摘
要
:
p>
研究现有的多种动态图像设计方法
,
分析其
优
缺点及适用性。
将各种动态图像设计方法汇总
,
根据采用设计
语言及不同设计方法进行分类
,
详尽阐述各种设计方法的原
理
,
说明其使用模式。
通过执行速度及程序复杂性等分析
各种
方法的优缺点及适用性。为各种操作系统
(
包括嵌入式系统
)
的开发者进行动态图像设计拓宽了视
野
,
并给出了方法选择
建议。
关键词
:
动态图像
;
高速平滑
;
第三方软件
;
翻页
中图分类号
:TP391
文献标识码
:A
文章编号
:1004-373X(2
009)12-073-05
Comparative Analysis on Varieties of
Methods for
Designing Animated-images
ZHANG Yinan
(Navy Submarine
Academy,Qingdao,266071,China)
Abstract:Varieties of current methods
for designing
animated images are
researched,and their superiorities and
disadvantages are ies of current
methods for
designing animated images
are enumerated,which are
categorized
basing on different designing languages and
means,principles and superiorities and
disadvantages of varieties of methods
by comparing performing
velocities and
program complexities are exploits
visual field and provides suggestions
of method-choices for
kinds of
OSs(including embedded systems) developer.
Keywords:animated-images;high-speed
smoothness;third-party software;flip
0
引
言
动态图
像技术是计算机图形学中的重要内容
,
它广泛用
于游戏娱乐、辅助教学、科学实验模拟等计算机辅助设计。
在程序设计中
,
动态图像的设计是程序员经常遇到的问题
,
其
设计语言和方法多种多样。根据是否需要借助于其他应用软<
/p>
件和程序
,
可以将这些方法分成两大类。
第一类是只使用各种
编程语言及开发环境中包含的文件和框架实
现的设计方法
;
第二类是安装相关软件
(
诸如
Flash,DirectDraw
等
),
在相关语
言的开发环境中将
这些软件的功能文件包含进去
,
共同实现
动态图像设计的方法。
然而
,
有关
动态图像的设计
,
现有的教程资料中大都“各
< br>顾眼前人”
,
其方法分散
(
p>
见于各种开发语言的编程指南中
),
很少将
各种动态图像的设计方法汇总成资料。本文正是做了
这方面工作
,
希望帮助动态图像设计的开发人员对动态图像
设计有一个清晰
、宏观的认识
,
拓宽视野
,
在选取设计方法时
,
能够辨明利弊
,
灵活使用。这样
,
使用者也
可以看到更加赏心
悦目的界面。
1
动态图像设计的原理
程序设计中动态图像设计的原理类
似于电影中普通的
动画原理
,
都是利用
人的视觉具有“暂留”的生理特点
(
即人
眼对动态图像的变化仅能分辨出时间间隔为
25 ms
左右的
变
化
,
如果图像变化太快
,
则人眼无法分辨
),
使连
续的静止画面
看上去具有动感。
在程序设计中可以在屏幕上画出
一张图像
,
而这张图像将在不同时间出现
,
然后一张张快速
(
时间间隔小
p>
于
25 ms)
呈现在屏幕上
,
从视觉效果上看这些画面就如同电
影在连续变化一
样
,
给人以动的视觉感觉。
2
不需安装第三方软件的动态图像设计方法
2.1
最简单的
Logo
程序语言设计方法<
/p>
Logo
是一种解释型语言
,
与其他的语言不同
,
它内置了一
套
Turtle Graphics
系统
,
令程序设计更加形象化
,
也更易
于理
解
,
使得用户可以通过简单的编程
创作出丰富多彩的视觉效
果或图案。
Logo
程序语言中
,
常用的图像动态效果可以归纳为闪
烁、旋转和移动三种。
2.1.1
使图像闪烁的编程技巧
使图像闪烁的编程技巧如图
1
所示。
图
1
使图像闪烁的编程技巧
2.1.2
使图像旋转的编程技巧
下面给出画一个金光四射太阳的程
序实例
,
如图
2
所示。
图
2
画一个金光四射的太阳的过程
画太阳光芒的程序如下
:
TO TYG
SETPC 14
REPEAT 30[PU FD 60 PD FD 20
PU BK 80 PD
RT 360/30]
END
擦除太阳光芒的程序如下
:
TO
TYGPE
REPEAT 30[PU FD 60 PE FD 20 PU BK 80 PD
RT
360/30]
END
太阳光旋转的程序如下
:
TO SHINE
DRAW SETPC 12
(STAMPOV
AL 50 50
“
TRUE)
REPEAT 72[ TYG
WAIT 10 TYGPE RT 360/72]
END
2.1.3
使图像移动的编程技巧
使图像移动的编程技巧如图
3
所示。
图
3
使图像移动的编程技巧
2.2
C
程序设计方法
2.2.1
四种常用方法
使用
C<
/p>
语言来设计动态图像的方法有很多
:
(1)
利用动态开辟图视口方法。在位置动态变化
,
但大小
不变的图视口中
(
用
se
tviewpot()
函数
)
设置固定
图形。这样
,
呈现在观察者面前的是当前图视口位置在动态变化
,
因而在
屏上看到的图像就好像在动态
变化一样。
(2)
利用显示页和编辑页交替变
化。将当前显示页和编
辑页分开
(
用<
/p>
setvisualpage()
和
se
tactivepage()
函数
),
在编辑页
上画好图形后
,
立即令该页变
为显示页
;
然后在上次显示页上
进行画
图
,
画好后
,
再交换
;
如此反复
,
< br>观察者的视觉上就出现
了动态变化的效果。
(3)
利用画面存储再重放的方法。像制作幻灯片一样
,
将
整个动画过程变成一个个片断
,
< br>然后存储到显示缓冲区内。
当
它们按顺序重放到屏幕上时
,
就出现了动态变化效果。
(4)
直接对图像动态存储器进行操作。利用显示适配器
上控制图像显
示的各种寄存器和图像存储器
VRAM,
对其进
行直接操作和控制
,
从而高效且快速地实现图像动态效
果。
利用上述
4
种方法均可以设计动态图像
,
但其操作比较
复杂
< br>,
且在程序中要对图像不断进行存取操作
,
需要耗费大量
内存资源。利用擦除法动态图像设计可以解决上述问题。
2.2.2
擦除法动态图像设计
擦除法
动态图像设计在很多动画制作工具
(
如
Flash)
中
大量使用
,
但在程序设计中却少有人用。
它的设计原理是利用
同色原理
,
在图形色与背景色相同时人眼不能感知。
在程序设
计中
,
当一个位
置画了一张图像时
,
使图像色与背景色相异
;
然
后再到另一个位置画一张图像并使图像色与背景色也相
异。
此时
,
将先前画的图像在原位置再
画一张
,
并使图像色与背景
色相同
p>
,
这样人眼只能看到新画的一张图像而看不到先前画
的图像
,
从而先前画的图像感觉被擦除了。
这样连续画多张图
像
,
并
在每画一张新的图像时将原有的图像擦除
,
即可实现观
察者角度的动态效果。
2.3
CBuilder
中进行动态图像设计
动态图
像设计中两个非常重要的方面就是图形的产生
及对时间的控制。
CBuilder 5
为解决这两个问题提供了良好
的方案
p>
:
一方面
,
可以利
用现成的
Shape
组件产生常见的图像
形体
;
另一个方面
,
可以利用
Timer
组件
,<
/p>
对动画的时间进行准
确的控制。
读者可以自行查找
CBuilder 5
应用指南中的相关示例应
用程序
,
以
了解其设计方法。
2.4
利用
Java
Applet
编程实现图像动态
2.4.1
Java
中实现动态图像的原理
在
Jav
a
中实现动态图像有很多种办法
,
但其
基本原理是
一样的
,
即在屏幕上画出一
系列的帧来造成运动的感觉。
为了
每秒钟多次更新屏幕
,
必须创建一个线程来实现动态图像的
循环
p>
,
这个循环要跟踪当前帧
,
并响应周期性屏幕更新的要
求。
动态图
像设计中最常遇到的问题便是屏幕会出现闪烁
现象。闪烁有两个原因
:
一是绘制每一帧花费的时间太长
(
因
为重绘时要求的计算量大
);
二是
在每次调用
Pain()
前
,Java
会
用背景颜色重画整个画面
,
当进行下一帧计算时
,
用户看到的
是背景。
有两种方法可以明显地减弱闪烁
:<
/p>
重载
update()
或使用
双缓冲。
2.4.2
重载
update()
方法减弱闪烁
当
AWT
接收到一个
applet
的重绘请求时
,
它就调用
applet
的
update(
);
默认地用
update()
清除
applet
的背景
,
然后
调用
paint()<
/p>
。
重载
upd
ate(),
将以前在
paint()
中的绘图代码包
含在
update()
中
,
从而避免每次重绘时将整个区域清除。
使用
update()
方法不会清除整个画面
< br>,
只是消除必要的部
分。
2.4.3
使用双缓冲方法减弱闪烁
双缓冲
方法在许多
Applet
中被使用。
其
主要原理是创建
一个后台图像
,
将需要
绘制的一帧画入图像
,
然后调用
Dra
wImage()
将整个图像一次画到屏幕上去
;
其好处是大部分
绘制是离屏的
,
将离屏图像一次绘至屏幕上比直接在屏幕上
绘制要有效得多
,
大大提高了做图的性能。
双缓冲可以使图像动得平滑
,
但有一个缺点是它需要分
配一张后台图像<
/p>
,
所以
,
如果图
像相当大
,
就将需要很大的内
存。
p>
2.5 Windows
API
实现动态图像的基本方法
在
Win
dows
中实现动态图像的方式有很多种
,
但基本原
理却非常类似。即
:
在初
始位置显示初始图形
,
经过短暂的延
时
后
,
去除掉初始图形
,
并在新的位置显示新的图形
;
这些步骤
加以循环
,
便形成了动态的效果
(
这里应该首先掌握
Windows
调色板及三元光栅操作的基本概念
)
。
比如<
/p>
,
计算机上实现“淡入淡出”技术
,
p>
采用的办法是在
已显示的位图
A
上
,
不断开些小洞
,
p>
在小洞内显示位图
B
的像
< br>素
,
随着小洞逐渐增多
,
位图
A
越来越模糊
,
位图
B
越来越清晰
,
最后
,
位图
A
消失
,
位图
B
完整地显示出来。
以下为常用动态图像设计方法
:
接下来结合
C++
程序介绍一些
Windows
下常用的动态
图像设计方法。
(1)
底色覆盖法
底色覆盖法是利用屏幕底色将原始
图形覆盖掉
,
该法实
现的动态图像具有
明显的闪烁效果。
(2)
多图片切换法
这种动态图像实现方法的效果类似
于
Gif
动态图像的效
果。
其原理是将动态图像的帧事先绘制出来
,
存为位图
文件或
位图资源
,
并按照动态图像的顺
序为这些帧加以编号。
当要显
示动态图像时
,
在指定的位置
,
间隔适当的时间
,
按照顺序显示
已经绘制好的位图帧<
/p>
,
从而达到动态图像的目的。
下面是利用这种方式实现的动态图像程序框架
:
//
bm[ ]
为多张位图文件的路径及文件名数组
,
按照顺序
储存了多张位图
// picBox
为
PictureBox
控件的一个实例
for( i=0; iPicture =
bm[i];//
选中位图
::Seep(100); //
延时
if( i == len(hbm) - 1 ) i =
-1
}
(3)
异或方式
利用异
或方式实现动态图像的例子比较多
,
比如绘图软
件中的“橡皮筋技术”
。
“异或”是一种逻辑组合的方式<
/p>
(
在
Windows
编程中
,
绘