推荐文档列表

大屏幕图像的快速保存和恢复

时间:2021-10-01 09:53:04 计算机论文 我要投稿

大屏幕图像的快速保存和恢复

摘 要 该文介绍了一种在图形状态下能快速保存和恢复任意大小,任意数目的屏幕区域的新算法及其C实现,该算法可代替Turbo C 2.0, Borland C 3.1中的imagesize, getimage, putimage位图函数,屏蔽内部实现细节。适合于需要保存和恢复大屏幕图象区域的工程软件及使用多级菜单窗口软件系统中。

一、Turbo C Borland C 中的三个位图操作函数

unsigned far imagesize (int left, int top, int right, int bottom);

void far getimage (int left, int top, int right, int bottom, void far *bitmap);

void far putimage (int left, int top, void far *bitmap);

原型在graphics.h中,这三个函数用于把屏幕上的一个位图拷贝到主存储区(640K内),然后把它放回屏幕。getimage将屏幕上的一个矩形区域的位图拷贝到主存储区(640K内)中,left、top、right、bottom四个参数用于定义屏幕上的矩形。bitmap指向主存储区中存放位图的区域。该区域前两个Bytes用于存放矩形的宽和高。其余部分存放位图本身。imagesize决定getimage用于保存指定矩形所需的字节数。它返回的位图大小包括用于记录矩形的宽和高的空间。putimage将以前用getimage保存的位图重新送回屏幕。位图左上角位于(left, top),bitmap指向主存储区中存放位图的区域。

以目前最通用的VGA 640*480*16色方式为例,当需要保存整个屏幕区域时约需640*480/2=153,600 Bytes,约合150 KB左右。而imagesize计算存储指定目标区域所需字节数,若指定区域要求字节数> = 64K-1则返回0xFFFF (-1),使程序无法存储。另外,getimage所需的缓冲区是从Heap中申请的或是静态申请的。因此要占用宝贵的640K常规内存。如果有>=640KB/150KB=5幅的大屏幕图像需要保存和恢复,则内存将会用尽而出错。在大型工程软件项目及各种GUI中,快速保存及恢复屏幕图像已成为一种良好的界面设计方法,因此本文介绍了一种简便,易行的新算法用于替换上述标准的位图操作函数。

二、三个新的位图函数

void NewGetImage (int left, int top, int right, int bottom, int win-id);

void NewPutImage (int left, int top, int right, int bottom, int win-id);

int NewImageSize (int left, int top, int right, int bottom, int *height, int*block-num);

首先,将需要保存的指定目标区域(left, top,right, bottom)等分成若干个存储面积小于64KB-1的小矩形块B1,B2,B3,..., Bn,然后利用标准的imagesize和getimage函数分n次将各块保存到同一个位图文件中。文件名形式为"WINXXX. SAV", "XXX"是该区域(或称为窗口)的标志号,它应是000-999之间的一个值,且是唯一的。如WIN666.SAV.分块算法如下:

(i)单块高度=单块的最大块长*每字节点数/块宽度

(ii)分块总数=指定目标区域高度/单块高度

(iii)实际分块总数=分块总数,如果指定目标区域高度%单块高度=0

分块总数 1,如果指定目标区域高度%单块高度!=0

注:

(a):单块的最大块长越大,则单块高度越大,分块总数越小,显示速度越快,但应小于64KB-1,一般取63KB以下。

(b):每字节点数由当前显示器的图形方式确定。如当前一个点能够显示的最大颜色数为MaxColor,则每字节可存储的点数为:log2 MaxColor。如对VGA 640 * 480 * 16方式每字节点数=2。用户需要在初始化图形方式后,给定每字节点数,本文以如下方式实现:

switch ((getmaxcolor () 1))

{

case 2 :DotPerByte=8; break;

case 4 :DotPerByte=4; break;

case 16 :DotPerByte=2;

[1] [2] [3] [4] [5]