在TVGA上實現全屏幕動畫

學識都 人氣:1.24W
在TVGA上實現全屏幕動畫

   在圖像處理領域,當處理或分析序列運動圖像時,需要在屏幕上連續顯示這一序列圖像(即動畫播放),以便觀察處理效果或分析動態信息。一般遊戲動畫的設計方法是慢速移動背景和快速刷新運動目標(小畫面),難以實現全屏動畫效果。爲此筆者採用了彙編語言編程和快速寫屏的方法,在普通的486微機(主頻66M,配TVGA9000卡)上達到了每秒顯示10幅640×480×256灰階圖像的速度,效果令人滿意。
首先設置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]="