在TVGA上實現全螢幕動畫

才智咖 人氣:1.23W
在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]="