首先设置TVGA卡使其工作在0X5d方式下,屏幕分辨率是640×480×256色。然后重新构造调色板(RemapPalette()),使其适于显示256灰阶的图像。由于TVGA卡的颜色寄存器使用18位存储模式,即R、G、B分量各占6位,而要显示灰度图像R、G、B分量必须赋予相同的值,所以就只能显示区分26=64灰阶的图像。不过,实验表明人眼已无法区分64灰阶与256灰阶图像的差别。因此,在构造调色板时,0~3索引值对应的R、G、B分量值都为0,4~7索引值对应的R、G、B分量值都为1,…,依次类推,这样就可以正确显示一幅256灰阶的图像。
以下是动画播放序列运动图像完整的源代码(AVD.C)。为连续显示一序列图像,先将序列图像的数目(如20)、存放图像数据文件的路径(f:\zyf\)、图像文件的名称(如z1.img,z2.img,…)录入一文本文件(如imggroup.lst),运行程序时只需键入AVD imggroup.lst即可。源程序中显示每幅图像的代码部分采用嵌入汇编语言编写,以得到较高的显示速度。在程序运行过程中,按下空格键暂停;连击空格键实现单帧播放;按下任意其它键恢复连续播放;按下退出键(Escape)退回DOS。在程序设计时,为避免在一个循环结束过渡到下一个循环开始时将要从序列的最后一幅图像切换到第一幅图像,因为这时由于图像运动的不连续性将产生突变,以至屏幕显示有抖动感或闪烁感,所以笔者采用了第一个循环正向播放,第二个循环反向播放(即正反相间)的方案。如果读者只希望正向播放,只须删除源程序中标有“//$$$”的四条语句行即可。
编译运行环境:本程序用MS C6.0编译通过,编译时请使用命令行参数/STACK:20480;图像数据文件来自大恒公司的VP32图像采集板(512×512×256灰阶)。
#include <graph.h>
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <time.h>
#define IMGGRP 30 //Image Number in a Cycle Showing
#define ESCAPE 27 //Stop Showing and Exit
#define SPACE 32 //Step Show--Hit Space Bar & One by One Showing
void RemapPalette(void);
void main (int argc,char *argv[])
{
static char grpflnm[IMGGRP][80];
char path[80],flnm[80],bindfn[80],arg[5];
char fnch[2]="\0";
char ch-imgnum[5];
int i,i1,i2,i12,ii,imgnum=IMGGRP;
int dispimgs,keyin,StepShow=0;
unsigned short int VSEG;
union REGS inregs,outregs;
FILE *fp;
unsigned short int row=480,col=512;
unsigned char fb[512];
int m-b=0;
clock-t cstart,cend; /* For clock */
unsigned short int FH; // File Handle
printf("\n ********** GROUP IMAGES ANIMATEDLY SHOWING ********* \n");
if(argc>1)
strcpy(flnm,argv[1]);
else
{
printf("\n Input the Image Group file name [.lst]:");
gets(flnm);
}
REDISP:
if(!strchr(flnm,'.'))
strcat(flnm,".lst");
if((fp=fopen(flnm,"rt"))==NULL)
{
printf("\n Open file failure!! \a\a\n");
[1] [2] 下一页