• 计算机讨论版
  • 电脑诊所
  • 菜鸟学院
  • 软件世界
  • 安全专区
  • 硬件世界
  • 网络世界
  • 网页设计
  • 图像设计
  • 程序设计
  • 操作系统
  • 计算机考试
  • 电脑故障
  • 电脑学习
  • 电脑技术
  • 电脑入门
  • 计算机知识
  • 电脑之家
  • 故障诊断
  • 电脑医院
  • 电脑学校
  • 电脑维护
  • 电脑医生
  • 电脑问答
  • 计算机问题
  • 电脑小知识
  • 电脑软件
  • 电脑diy
  • 你问我答
  • 网友俱乐部
  • 实用技巧
  • 初级应用
  • 心得分享
  • 软硬兼施
  • 电脑之家
  • 维护资料
  • 软件应用
  • 软件交流
  • 电脑硬件
  • 硬件知识
  • 电脑网络
  • windows
  • 图像设计

    图像设计
    ·求助:金山系列PNG图标
    ·谁有新火星人-3ds max 5白金手册CD2?
    ·求空调3D效果图
    ·[求助斑竹]如何压缩FLASH?
    ·[求助]
    ·急救??
    ·如何在CORELDRAW里插入条形码?
    ·龍兒   你要的图!!
    ·求助大虾们
    ·个位大哥请不帮帮我谁能用3DMAX做手表的模型
    ·flash-mx中将图像打碎是怎么做的
    ·软件高手请进来~~谢谢
    ·急寻3D MAX家具模型
    ·高手帮我看看这段FLASH 动作脚本哪出错...
    ·求一款MAX插件!!"巴西渲染器"!!
    ·photoshop 7.0怎样使字体变得更小
    ·关于图片处理的问题!
    ·[贴图]头一次画,给点意见!
    ·求PS简单的教程。
    ·迷你版与完整版有什么区别
    ·[求助]快来回答我!!
    ·[求助]AE插件FE Pixel Polly
    ·有没有较小的jepg图像编辑文件可以下载?
    ·视频教学
    ·请教高手如何用CORELDRAW 11把位...
    ·求CORELDRAW 11简体中文版下载地址
    ·photoshop怎么做那种图片?
    ·有人知道FLASH超连接吗?
    ·FLASH高手。。 进来看看。。。 帮帮我。。。。
    ·用Fireworks2制作动画

    swf文件结构解析

    类别: 图像设计  时间: 2007.03.15

    酷の尐奶瓶
    swf文件结构解析
    第1节


    swf文件的整体结构是 header + body的组成。

    文件的开始是一个[文件头]
    它的结构如下:
    字节      名称            说明
    1          Signature     “F”表示非加密格式,“C”表示加密格式
    1          Signature     “W”无特殊意义
    1          Signature     “S”无特殊意义
    1          Version        版本号,它表示对应播放器版本
    4          FileLength    整个文件长度,低位在前
    N          FrameSize    RECT结构体,表示屏幕大小,具体结构和长度根据数据变化,分析方法另外讨论。
    2          FrameRate    帧频,默认为12,高位在前
    2          FrameCount  帧数,表明文件根下的帧数,低位在前

    以上是swf中,最简单的一个tag,一个完整的swf文件是由很多独立的tag组成的。每一个tag都包括一个头和一个数据体,头有2种类型,短tag型和长tag型。

    短tag型由2byte构成,前10个bit表示tag类型,后6个bit表示tag长度。

    长tag型由6byte构成,前10个bit表示tag类型,后6个bit固定为全1,后4个byte代表tag长度。

    tag的长度不同于文件头的长度FileLength,它是除去tag头后的长度。

    (另外)只有非加密的swf文件可以直接用以上的方法解析,加密的文件需要另外增加一步处理。


    第2节

    前节说明了swf文件是由1个head和1个body构成的。
    并且解析了header的结构,和一个tag的header部分的简单说明。

    下面余下的就是swf文件的body了。

    整个文件body是由大量的tag组成的,通过分析tag的head部分,可以立刻知道这个tag的类型代码和长度。

    如果你无法识别这个tag的类型,也可以利用tag的长度,直接跳过这个tag。

    这种方式保证了版本的兼容性,即使出现了新的tag,老版本的播放器还是能够解析完整个swf文件而不出现错误,大不了就是不能提供新的功能而已。

    以下就是swf文件结构的一个形象概念。
    (文件header)(文件body)
                  |
    (tag 1)(tag 2)(tag 3)(……)
       |
    (tag header)(tag body)
       |
    (tag 类型代码)(tag 长度)


    这样大家是否对swf文件的结构有了一个基本的认识?

    下一节我会分析一下几个swf必有的tag,包括 backgroundColor tag,showFrame tag和end tag

    第3节
    setBackgroundColor tag

    这个tag是直接跟在文件head后面的第一个tag,是文件中必然存在的。
    它的结构如下:
    字节           名称                        说明
    2               header                    tag头,短tag型 类型码为9
    3               BackgroundColor       RGB类型,右3个字节,分别表示红、绿、蓝

    showFrame tag

    这是文件最后第2个tag,它是必然存在的。
    结构如下:

    字节           名称                        说明
    2               header                    tag头,短tag型 类型码为1

    end tag

    结束tag,它的作用不用我说了,必然是文件的最后一个tag。

    字节           名称                        说明
    2               header                    tag头,短tag型 类型码为0

    下一节我将讲的是character ID 和Depth的意义和textField的基本tag组成。


    第4节
    一个textField就是一个文本框,文本框有3种,静态的,动态的,和输入型。作为tag的话,它只有2种,静态的和动态的,输入型不过是动态的一种特别形式。

    这里讨论动态文本框的组成。
    它由3个tag组成,2个定义tag和一个控制tag
    分别是:
    定义tag DefineFont2 DefineEditText (针对player 7.0 如有不同情况请检查播放器版本)
    控制tag PlaceObject2

    DefineFont2 定义了一个字体信息, DefineEditText引用了定义的字体,并定义了显示的文字信息,而PlaceObject引用了定义的文字信息,并控制了文字的显示。

    他们之间的引用就是依靠character ID进行的。

    character ID就是一个从1开始的数字标示,如果中间出现缺漏,从缺漏开始的所有character ID都被忽略,而重复的话,后出现的将覆盖先出现的tag。

    DefineFont2用一个character ID 来标示自己,DefineEditText和PlaceObject2也同样如此。但并不是所有的tag都有character ID。
    另外,PlaceObject2虽然也有character ID,但它并不是用来标示自己的,而是用来调用的。

    而深度Depth在3个tag中只有PlaceObject2拥有。

    [此贴子已经被作者于2004-5-14 13:24:26编辑过]


    酷の尐奶瓶

    定义型和控制型tag(Definition and Control Tags)是swf文件tag的两种类型。定义型tag定义的swf影片的内容,像形状啊,文字啊,位图啊,声音啊等等。每个定义型tag都分配

    了一个唯一的标识ID叫做角色ID.flash播放器则把这些角色放到一个存储空间里面,这个存储空间我们一般叫它字典。用定义型tag是不会绘制任何图形的,不会产生任何动画的。

    因为这些事都交由控制型tag来做。控制型tag做的就是从字典里取出角色,操作这些的绘制和运动等,控制整个影片的流程。

    这些tag是怎么排序存储起来的呢?总的来说,tag可以出现任何情况的排序方法,但也不是随便乱排咯。 它遵循一些规则。


    1.一个tag只能依靠在它之前的tag,不能依靠在它之后的tag.
    2.一个定义了角色的定义型tag必须在引用这个角色的控制型tag之前。
    3.流媒体tag必须有顺序,没有顺序的流媒体播放起来也是没有顺序的
    4.结尾标签(tag)应该在swf文件的最后。


    酷の尐奶瓶

    这是swf 文件的组成形式.swf文件头占21字节,尾标签(EndTag)占三个字节.其它的tag每个都有统一的组成结构,而且它们是彼此独立的.从这个tag不能访问那个tag的数据.每个tag内部的数据读取方法是根据数据的偏移量(offset)来读取.因为是独立的,所以你可以用工具来修改,添加,删除swf文件里面的tag.


    // java的添加tag 
    final TagCollection tc = new TagCollection(); 
    tc.add(tag1); 
    tc.add(tag2); 
    ... 
    final TagEnumeration te = tc.close(); 

    重复sansunzw兄弟的了:
    tag可以分为两种,一种是定义型tag,另外一种是控制型tag.
    tag按长度也可以两种,一种是长型tag,一种是短型tag.]
    tag一般都由tag头开始.
    短型tag的tag头有十六位,高十位为tag的类型,低六位为定义这个tag的长度.因为是6位,所以短型tag只能最多是2^6 =64字节左右大小.swf 有规定不能超过62字节大小.
    长型tag的tag头有48位,16位tag类型定义+32位tag长度定义.所以长型tag最大长度能为2^32=4G字节.这可远远超过了我们平时用到的那个数量级了.

    //这个java 的关于swf tag头的一个类
    //很多相关的代码不列了
    public class TagHeader {

    int tagID;
    long length;

    public TagHeader(int tagID, long length) {
    this.tagID = tagID;
    this.length = length;
    }

    public void setTag(int tagID) {
    this.tagID = tagID;
    }

    public int getTag() {
    return tagID;
    }

    public void setLength(long length) {
    this.length = length;
    }

    public long getLength() {
    return length;
    }
    }


    上一篇:求助:金山系列PNG图标 下一篇:photoshop 7.0怎样使字体变得更小

    计算机讨论版 © 版权所有

    提示:计算机讨论版致力于电脑信息的分享与传播,内容仅供参考,按此操作责任自负。