国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

在TVGA上實(shí)現(xiàn)全屏幕動(dòng)畫

2019-11-17 05:29:24
字體:
供稿:網(wǎng)友
    在圖像處理領(lǐng)域,當(dāng)處理或分析序列運(yùn)動(dòng)圖像時(shí),需要在屏幕上連續(xù)顯示這一序列圖像(即動(dòng)畫播放),以便觀察處理效果或分析動(dòng)態(tài)信息。一般游戲動(dòng)畫的設(shè)計(jì)方法是慢速移動(dòng)背景和快速刷新運(yùn)動(dòng)目標(biāo)(小畫面),難以實(shí)現(xiàn)全屏動(dòng)畫效果。為此筆者采用了匯編語言編程和快速寫屏的方法,在普通的486微機(jī)(主頻66M,配TVGA9000卡)上達(dá)到了每秒顯示10幅640×480×256灰階圖像的速度,效果令人滿足。
    首先設(shè)置TVGA卡使其工作在0X5d方式下,屏幕分辨率是640×480×256色。然后重新構(gòu)造調(diào)色板(RemapPalette()),使其適于顯示256灰階的圖像。由于TVGA卡的顏色寄存器使用18位存儲(chǔ)模式,即R、G、B分量各占6位,而要顯示灰度圖像R、G、B分量必須賦予相同的值,所以就只能顯示區(qū)分26=64灰階的圖像。不過,實(shí)驗(yàn)表明人眼已無法區(qū)分64灰階與256灰階圖像的差別。因此,在構(gòu)造調(diào)色板時(shí),0~3索引值對(duì)應(yīng)的R、G、B分量值都為0,4~7索引值對(duì)應(yīng)的R、G、B分量值都為1,…,依次類推,這樣就可以正確顯示一幅256灰階的圖像。
    以下是動(dòng)畫播放序列運(yùn)動(dòng)圖像完整的源代碼(AVD.C)。為連續(xù)顯示一序列圖像,先將序列圖像的數(shù)目(如20)、存放圖像數(shù)據(jù)文件的路徑(f:/zyf/)、圖像文件的名稱(如z1.img,z2.img,…)錄入一文本文件(如imggroup.lst),運(yùn)行程序時(shí)只需鍵入AVD imggroup.lst即可。源程序中顯示每幅圖像的代碼部分采用嵌入?yún)R編語言編寫,以得到較高的顯示速度。在程序運(yùn)行過程中,按下空格鍵暫停;連擊空格鍵實(shí)現(xiàn)單幀播放;按下任意其它鍵恢復(fù)連續(xù)播放;按下退出鍵(Escape)退回DOS。在程序設(shè)計(jì)時(shí),為避免在一個(gè)循環(huán)結(jié)束過渡到下一個(gè)循環(huán)開始時(shí)將要從序列的最后一幅圖像切換到第一幅圖像,因?yàn)檫@時(shí)由于圖像運(yùn)動(dòng)的不連續(xù)性將產(chǎn)生突變,以至屏幕顯示有抖動(dòng)感或閃爍感,所以筆者采用了第一個(gè)循環(huán)正向播放,第二個(gè)循環(huán)反向播放(即正反相間)的方案。假如讀者只希望正向播放,只須刪除源程序中標(biāo)有“//$$$”的四條語句行即可。
    編譯運(yùn)行環(huán)境:本程序用MS C6.0編譯通過,編譯時(shí)請(qǐng)使用命令行參數(shù)/STACK:20480;圖像數(shù)據(jù)文件來自大恒公司的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
        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");
    printf("/n Please Check following files whether exist:");
    printf("/n%s",flnm);
    printf("/n/n Note:The file extension name is appended automatically,");
    printf("/n sUCh as [.lst]!");
    exit(1);
    }
    inregs.x.ax=0x005d; // Set TVGA Mode:640x480x256 levels
    int86(0x10,&inregs,&outregs);
    RemapPalette();  // Remap all Palette
    cstart= clock();  /* Use clock for timing to hundredths of seconds */
    strcpy(ch-imgnum,"/0");
    for(;;)     // Read image number in group
    {
    fread(fnch,sizeof(char),1,fp);
    if((int)fnch[0]==10) break;
    strcat(ch-imgnum,fnch);
    }
    imgnum=atoi(ch-imgnum);
    strcpy(path,"/0");
    for(;;)    // Read image path in group
    {
    fread(fnch,sizeof(char),1,fp);
    if((int)fnch[0]==10) break;
    strcat(path,fnch);
    }
    for(i=0;i<imgnum;i++) // Read image name in group
    {
    strcpy(grpflnm[i],"/0");
    for(;;)
    {
    fread(fnch,sizeof(char),1,fp);
    if((int)fnch[0]==10) break;
    strcat (grpflnm[i],fnch);
    }
    }
    keyin=0;
    StepShow=0;  // Continuous Showing defaultly
    dispimgs=0;
    i1=0; i2=imgnum-1; i12=1;
    for(;;)  // SHOW IMAGES--ANTMATE PICTURE [STUDIO]
    {// REPEAT CYCLE FOREVER
    for(i=i1;i<=i2;i+=i12)
    {
    if(kbhit())
    {
    keyin=getch();
    if(keyin==ESCAPE) goto CONTINUE;  //Stop Showing and Exit
    if(keyin==SPACE) StepShow=1;  // Step Show--Hit Sapce Bar
      else StepShow=0;  // Continuous Showing--Hit Any Other Key
    }
    if(StepShow==1)
    {
    keyin=getch();  //Standy by
    if(keyin==ESCAPE) goto CONTINUE;
    if(keyin!=SPACE) StepShow=0;
    }
    strcpy(bindfn,path);
    strcat(bindfn,grpflnm[i]);
    strcpy(flnm,bindfn);
        VSEG=0;
        -asm
    {
    MOV AH,3dh  ;Open File
    MOV AL,0c0h
    LEA DX,
Word PTR flnm
    INT 21h
    MOV FH, AX
    MOV AX,0a000h
    MOV ES,AX
    XOR DI,DI
    MOV AX,0eh
    MOV DX,3c4h
    OUT DX,AL
    XOR AX,AX
    XOR AX,02h
    MOV DX,3c5h
    OUT DX,AL
    MOV CX,row
    OUTER-CYCLE:
    PUSH CX
    MOV AH,3fh ;Read File a Line Once
    MOV BX,FH
    MOV CX,col  ;col=512
    LEA DX,WORD PTR fb
    INT 21h
&nbs


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁海县| 大足县| 东莞市| 体育| 灌阳县| 八宿县| 南城县| 盘山县| 黔西县| 灌南县| 汉川市| 鹿泉市| 涡阳县| 婺源县| 华阴市| 潼关县| 平利县| 岳阳市| 屯昌县| 虹口区| 海淀区| 曲阳县| 宾川县| 白城市| 大方县| 溧水县| 清丰县| 保德县| 茌平县| 德庆县| 甘孜| 罗源县| 共和县| 文水县| 桃园县| 安西县| 吉安县| 金昌市| 晋江市| 滨州市| 丰顺县|