Autodesk公司的三维动画设计软件3DS在我国已广泛使用,其良好的性能为计算机专家和艺术家所肯定。其动画存储文件FLIC也给系统提供了存储和显示的方便。下面具体分析FLIC文件的格式及播放程序的设计。
一、FLIC文件格式的概述
FLIC文件事实上是对一个静止画面序列的描述,连续显示这一序列便可在上产生动画效果。FLIC文件结构简洁,弹出速度快,虽然每种基色最多只有256级灰度,图像深度只有8位,但使用起来很方便。
FLIC文件有两种类型:FLI文件和FLC文件。FLC文是FLI文件的进一步发展,它采用更高效的压缩技术,且其分辨率也不仅限于320×200。我们在PC上经常使用的FLI文件,因为它和VGA的320×200×256显示相匹配。
FLIC文件采取的压缩技术原理就是仅保存前一帧中改变的部分。这样占的空间小,弹出速度快。FLIC文件的结果可分为3个层次:文件层、帧层和块层。文件层给出了FLIC文件的基本特征。帧层定义了帧的缓冲和块中块的数目。块层包括块的大小、类型和实际数据。这样的层次结构很容易实现,特别是可以增加块的类型以满足新的需要,同时无需涉及原定义。
论文检测天使-免费论文相似性查重http://www.jiancetianshi.com
二、各层头的结构
1.FLI文件格式的结构定义
①文件头的结构定义
文件头长度为80H字节,其C语言结构定义如下
/* fli file hedaer struct */
typedef struct {
unsigned long fli-size;/* 00H:文件总长度 */
unsigned int magic; /* 04H:文件格式,FLC=AF12;
FLI=AF11; */
unsigned int frames-number; /* 06H:FLIC的帧数 */
unsigned int screen-width; /* 08H:屏幕宽度 */
unsigned int screen-height; /* 0AH:屏幕高度 */
unsigned int unuserd; /* 0CH:保留未用 */
unsigned int flags; /* 0EH:标志=0003 */
unsigned int speed; /* 10H:帧间播放速度单位 */
unsigned long next; /* 12H:置为0 */
unsigned long frit; /* 16H:置为0 */
unsigned char fli-expand[102]; /* 1AH:保留作扩展用=0 */
} FLIHEAD;
②帧头的结构定义
帧头长度为10H字节,其C语言结构定义如下:
/* frames header struct */
typedef struct {
unsigned long size-frame; /* 00H:帧大小,包括本帧头 */
unsigned int magic; /* 04H:帧标识字=0F1FAH */
unsigned int chunks; /* 06H:本帧块数 */
unsigned char expand[8]; /* 08H:保留未用=0 */
} FRAMESHEAD;
③块头的结构定义
块头长度为6H字节,其C语言结构定义如下:
/* chunk header struct */
typedef struct {
unsigned long size-chunk; /* 00H:块大小 */
unsigned type-chunk; /* 04H:块类型 */
} CHUNKHEAD;
2.FLC文件格式的结构定义
文件头长度为80H字节,其C语言结构定义如下:
/* fli file header struct */
typedef struct {
unsigned long fli-size; /* 00H:文件总长度 */
unsigned int magic; /* 04H:文件格式,FLC=AF12;
FLI=AF11; */
unsigned int frames-number; /* 06H:FLIC的帧数 */
unsigned int screen-width; /* 08H:屏幕宽度 */
unsigned int screen-height; /* 0AH:屏幕高度 */
unsigned int depth; /* 0CH:图像深度 */
unsigned int flags; /* 0EH:标志=0003 */
unsigned int speed; /* 10H:帧间播放速度单位
FLC=1ms, FLI=1/70s */
unsigned int reserved-1; /* 14H:保留未用 */
unsigned long createtime;
unsigned long creator;
unsigned long updatetime;
unsigned long updater;
unsigned int aspectx; /* 创建文件时的显示屏幕像素大小的纵横比,VGA320×200
unsigned int aspecty; 为6∶5 */
unsigned char reserved-2[0x26]; /* 保留未用,=0 */
unsigned long offsetframel; /* 50H: 论文检测天使-免费论文检测软件http://www.jiancetianshi.com
第一帧画面相对于文件
开始的偏移 */
unsigned long offsetframe2; /* 54H:第二帧画面相对于文件
开始的偏移 */
unsigned char reserved-3[0x28]; /* 保留未用=0 */
} FLIHEAD;
FLC的帧头和块头的结构定义和FLI文件格式的定义相同。
每块的数据紧接在FLIC文件头的后面。对于不同的块类型有不同的数据含义,下面就不同的块类型分别介绍,这是设计播放FLIC动画文件程序的关键之所在。
三、块类型的含义
FLIC格式文件中的块类型有许多种,每一种类型都有不同的定义,因此我们必须对每一种类型作出准确的分析。由于动画格式FLIC图像文件的块类型具有极强的可扩展性,在此我们只介绍几种常见的块类型。
1.类型04H
为每基色256级灰度的彩色调色板信息表FLIC-COLOR,其 论文检测天使-免费论文检测软件http://www.jiancetianshi.com
第一个字为需调色的调色子块数(一个字),紧接其后的是需调色的相应各块的数据定义:
字节 含义
论文检测天使-免费论文检测软件http://www.jiancetianshi.com
第一字节:跳色数,在本块中的需要跳过的颜色数(字节)。
第二字节:调色数,本块中有多少种颜色需要改变,当调色数为0时指调256色。初始时当前色号为零。
其后的字节:以三字节为一组,是需要改调色的相应的RGB值。
通常FLIC图像文件的头一帧的 论文检测天使-免费论文检测软件http://www.jiancetianshi.com
第一块数据便是该类型(或0BH类块)。在程序设计中我们定义了一个256色的调色板数组:
char palette[768];
用于完成调色板的初始化工作。
2.类型07H
该类型数据以字节为基础,只适用于.FLC文件,处理对 论文检测天使-免费论文检测软件http://www.jiancetianshi.com
第一帧图像的改变情况较为适用。它含有本帧图像对于上与帧图像的改变部分。
这种块类型是一种最常用的、最复杂的块类型,一般除了 论文检测天使-免费论文检测软件http://www.jiancetianshi.com
第一帧外后面的各帧通常采用这种块类型进行行数据压缩存储。它的描述如下:
字节含义
(1) 论文检测天使-免费论文检测软件http://www.jiancetianshi.com
第一个字:需要改变的行的数量
(2)第二个字开始:是具体需要改变的数据本身。每一行是进行单独的压缩的,这种技术的采用大大压缩了.FLC文件长度。它的具体定义为:可选字、小块数及小块的值。①可选字:
当高位=11时,低位部分为跳行数。该字可以有多个,其跳行数相加。当高位=10时,低位部分内容为当前行的最后一个字节。(作为本行的结束标志)。②小块数:当高位=00时,此字表示小块数的值。③小块: 论文检测天使-免费论文检测软件http://www.jiancetianshi.com
第一个字节:跳列数。第二个字节:小块类型:当该值为正时:表示要从块中搬到图像中的像素(字)个数N,其后就是N个连续的像素数据;当该值为负时:它的绝对值N表示要重复从块中搬到图像中的像素(字)的次数,其后就是那个像素的数据
。第三个字节:块中的图像数据(字)。
3.类型0BH
与类型04H类似,它与VGA的13H模式相匹配。
4.类型0CH
与类型07H类似,但它以字节为基础,通常用于.FLI文件
字节含义
(1) 论文检测天使-免费论文检测软件http://www.jiancetianshi.com
第一个字:从屏幕上方开始和上一帧相同的行数即本帧中 论文检测天使-免费论文检测软件http://www.jiancetianshi.com
第一行要改变的行号。例如:如果有一个改变(运动)仅仅只是在屏幕的底部,那么此时该字值为199(VGA320×200)。
(2)第二个字:需要改变的行的数量。
(3)第三个字以后:是具体需要改变的数据本身。每一行是进行单独的压缩的,这种技术的采用大大压缩了.FIC文件长度。它的具体定义为:小块数及块的值。
①小块数:此字表示小块的个数值,它是本行中含有小块的个数。当小块数=0时,说明本行和上一行相同,不用进行重新处理。
②小块: 论文检测天使-免费论文检测软件http://www.jiancetianshi.com
第一个字节:跳列数。第二个字节:小块类型:当该值为正时:表示要从块中搬到图像中的像素(字节)个数N,其后就是N个连续的像素数据;当该值为负时:它的绝对值N表示要重复从块中搬到图像中的像素(字节)的次数,其后就是那个像素的数据。第三个字节:
块中的图像数据。
5.类型0DH
该类型没有数据,该帧的所有像素值都为0。在实际应用中通常它只产生在当用户使用3DS创建一个新的FLIC文件中的 论文检测天使-免费论文检测软件http://www.jiancetianshi.com
第一帧。
6.类型0FH
该类型用于压缩图像,通常只用于 论文检测天使-免费论文检测软件http://www.jiancetianshi.com
第一帧。它采用了Run-Length压缩方法。该方法与类型07H及0CH中的行数据压缩方法是相似的。只是在该方法中正负号的定义与类型07H和0CH恰好相反。
字节含义
(1) 论文检测天使-免费论文检测软件http://www.jiancetianshi.com
第一字节 本行中小块数。
(2)第二字节 小块的具体内容。
① 论文检测天使-免费论文检测软件http://www.jiancetianshi.com
第一字节:小块类型:当该值为负时:它的绝对值表示要搬到图像中的像素(字节)个数,其后就是数据;当该值为正时,表示要将下一个像素复制到图像中的次数,该像素(字节)紧随其后。
②第二个字节:块中的图像数据。
7.类型10H
这种类型不进行压缩,块中的数据个数一定为图像的长宽相乘。这种类型在实际应用中一般不用。
下面具体讨论播放程序的C语言程序设计方法,本文中的程序是针对.FLI格式的动画文件而进行的程序设计。读者如果要播放.FIC格式的动画文件,只需根据.FIC文件格式的具体定义,并参照下面的程序设计方法即可设计出相应的程序。
[8]电大学习网.免费论文网[EB/OL]. /d/file/p/2024/0424/fontbr />四、程序设计
1. 论文检测天使-免费论文检测软件http://www.jiancetianshi.com
第一帧图像的播放程序
void First-Frame (Video-Mem, fli-fp)
char *Video-Mem;
FILE *fli-fp;
{
int Line-PacketNumber
int Size-Count=0
int Screen-Char;
long Sereen-Count=0L;
memset(Video-Mem, 0,60000);
do {
Line-PacketNumber=fgetc(fli-fp);
while(Line-PacketNumber--)
{
Size-Count=fgetc(fli-fp);
if ( (Size-COUNT & 0X80)==0X80
{
Size-Count=(256-Size-Count);
while(Size-Count--)
{
Screen-Count++;
Sereen-Char=fgete(fli-fp);
*Video-Mem++=Screen-Char;
}
}
else
{
Sereen-Char=fgete(fli-fp);
while(Size-Count--
{
Screen-Count++;
*Video-Mem++=Sereen-Char;
}
}
}
} while(Screen-Count<64000);
}
2.FLI后续各帧图像的播放程序
void Other-Frame(Video-Mem,Fli-fp,Update-LineNumber)
char *Video-Mem;
FILE *Fli-fp;
int Update-LineNumber;
{
int Size-Count=0,Skip-Col=0;
int Update-LineCount=0;
int Screen-Char;
int Number-Packet;
char *Video-p;
while(Update-LineCount<Update-LineNumber)
{
Video-p=Video-Mem;
Number-Packet=fgetc(Fli-fp)
Update-LineCount++;
while(Number-Packet--)
{
Skip-Col=fgete(Fli-fp);
Video-Mem=Video-Mem+Skip-Col;
Size-Count=fgetc(Fli-fp);
if ( (Size-Count & 0x80)==0x80)
{
Size-Count=256-Size-Count;
Screen-Char=fgetc(Fli-fp);
while(Size-Count--) *Video-Mem++=Sereen-Char;
}
else
{
while(Size-Count--){
Screen-Char=fgetc(Fli-fp);
*Video-Mem++=Screen-Char;
}
}
}
Video-Mem=Video-p+320;
}
}
3.播放程序的调用及其它几个子程序
void Transmit-Fli(Fli-fp)
FILE *Fli-fp;
{
int NUmber-Chunk;
if (fread((unsigned char *)&header,1,sizeof(FLIHEAD),Fli-fp)
==sizeof(FLIHEAD) )
if (header,magie|=0xAF11)
{
printf("Not an FLI file /n");
exit(0);
}
if (fread((unsigned char *)*frame-head,1,
sizeof(FRAMESHEAD),Fli-fp)==sizeof(FRAMESHEAD) );
if (frame-head,magic =0xF1FA)
{
printf("Reading an Erroe FLI file /n");
exit(0);
}
if (fread((unsigned char *)&chunk-head,1,
sizeof(CHUNKHEAD),Fli-fp)==sizeof(CHUNKHEAD) );
if ( fread(&NUmber-Chunk,1,sizeof(int),Fli-fp)==sizeof(int));
else {
printf("Error reading Fli/n");
exit(0);
}
fgetc(Fli-fp);fgetc(Fli-fp);
if (fread(&palette,1,sizeof(palette),Fli-fp)==768);
else {
printf("Error reading Fli/n");
exit(0);
}
if ( fread((unsigned char *)&chunk-head,1,
sizeof(CHUNKHEAD),Fli-fp)==sizeof(CHUNKHEAD) );
else {
printf("Error reading Fli/n");
exit(0);
}
ShowFli-Frame(Fli-fp);
fclose(Fli-fp);
}
void ShowFli-Frame(Fli-fp)
FILE *Fli-fp;
{
long Frame-DataAddress;
int First-UpdateLine, End-UpdateLine;
int Frame-Number=2,Adjust-Char=0;
init();
setvgapalette(palette);
First-Frame(MK-FP(0x0a000,0x0),Fli-fp);
Frame-DataAddress=ftell(Fli-fp);
while(Frame-Number<=header,frames-number-1)
{
Frame-DataAddress=ftell(Fli-fp);
Adjust-Char=fgetc(Fli-fp);
if (Adjust-Char |=0) fseek(Fli-fp,-1L,SEEK-CUR);
if (fread((unsigned char *)&frame-head,1,
sizeof(FRAMESHEAD),Fli-fp)==sizeof(FRAMESHEAD));
if ( frame-head,magic |=0xFIFA) exit(0);
if ( frame-head,chunks|=0)
{
if ( fread((unsigned char *)&chunk-head,1,
sizeof(CHUNKHEAD),Fli-fp)==sizeof(CHUNKHEAD));
if ( fread(&First-UpdateLine,1,sizeof(int),Fli-fp)
==sizeof(int));
else {
printf("Error reading Fli/n");
exit(0);
}
if ( fread(&End-UpdateLine,1,sizeof(int), Fli-fp)
==sizeof(int));
else {
prinft("Error reading Fli/n");
exit(0);
}
Other-Frame (MK-FP(0x0a000,First-UpdateLine*320),Fli-fp,
End-UpdateLine);
}
Frame-Number++;
}
}
void video-init()
{
union REGS r;
r.x.ax=0x0013;
int86(0x10,&r,&r);
}
void video-text()
{
union REGS r;
r.x.ax=0x0003;
int86(0x10,&r,&r);
}
setvgapalette(p)
char *p;
{
union REGS r;
struct SREGS sr;
int i;
for(i=0;i<768; ++i) *(p+i)=*(p+i)>>1;
r.x.ax=0x1012;
r.x.bx=0;
r.x.cx=256;
r.x.dx=FP-OFF(p);
sr.es=FP-SEG(p);
int86x(0x10,&r,&r,&sr);
}
本文主要论述了三维动画设计软件3DS中的动画存储文件FLIC的存储方式及针对FLI格式文件的播放程序的C语言设计方法。对于工作在高分辨率方式下的动画文件的播放程序的C程序设计,我们也可以通过同样的方法进行设计。
论文检测天使-学术行为不端检测免费软件http://www.jiancetianshi.com
总之本文只是提供给读者一种最基本的设计方法,为以后的进一步扩充提供了可能。
[8]电大学习网.免费论文网[EB/OL]. /d/file/p/2024/0424/fontbr />
相关文章:
学习化环境和师资培训04-26
未来计算机与计算机技术04-26
在微机上模拟电器控制线路的工作过程04-26
中国互联网发展现状分析04-26
网络隐私权的法律保护04-26
计算机基础课程远程教学系统的设计与实现04-26
面向空间信息服务的WebGIS分布式体系结构及关键技04-26
可支持多语言的工作流动态演进04-26
基于支持向量机的软件项目风险评价04-26
基于ANSYS的管道交变电磁场仿真分析04-26