[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[整理]fireworks输出gif,可以添加多个索引透明色的困惑~

上一篇:[备忘]tomcat下静态html输出时,header里charset=utf-8 的问题~~
下一篇:[备忘]ORA-01704:字符串文字太长

添加日期:2014/5/2 21:42:05 快速返回   返回列表 阅读3181次
首先,多处的文章(包括微软的文章)都提到,GIF图片的索引透明色,只能有一个透明色。

而且,看GIF的文件结构说明,索引色只有一个字节,只能存储一个透明色。

但是,fireworks输出gif时,

除了select color to transparent,remove color to transparent,

竟然还有一个add color to transparent,我晕~~

关键是,选择多个颜色透明,输出gif后,确实这些颜色的地方都透明了,

哦,what a fucking?

百思不得其解,困惑好些天,

今天决定自己做实验,终于搞明白了点。

结论就是:

GIF文件本身确实只能指定一个透明色,

Fireworks选择多个颜色是进行了变通处理的。

下面是gif结构中,图像控制块的结构:
===================================================================

typedef struct gifcontrol  //图像控制扩充块以0x21开始(Extension Introducer: 0x21) 
  { 
        BYTE byBlockSize; //用来指定该图像控制扩充块的长度,其取值固定为4 
        struct flag    //用来描述图像控制相关数据,它的长度为1个字节 
           { 
              BYTE Transparency   : 1;    //指定图像中是否具有透明性的颜色 
              BYTE UserInput      : 1;    //判断在显示一幅图像后,是否需要用户输入后再进行下一个动作 
              BYTE DisposalMethod : 3;    //指定图像 显示后的处理方式 
              BYTE Reserved       : 3;    //保留位,没有任何含义,固定为0 
           }  Flag; 
        WORD wDelayTime;        //指定应用程序进行下一步操作之前延迟的时间,单位为0.01秒 
        BYTE byTransparencyIndex;    //图像中透明色的颜色索引,指定的透明色将不在显示设备上显示 
        BYTE byTerminator;        //块终结符,其值固定为0 
  }  GIFCONTROL; 

===================================================================
在fireworks中,建一个100*100的画布,背景色为白色。

画两个小方块,一个填充红色,一个填充蓝色。
=====================================================================

1.gif,无透明
---------------------------
47 49 46 38 39 61 64 00  64 00 91 00 00 00 00 FF 
FF FF FF FF 00 00 00 00  00 21 F9 04 04 14 00 FF 
00
2C 00 00 00 00 64 00  64 00 00 02 DB 8C 8F A9 
CB ED 0F A3 9C B4 DA 8B  B3 DE BC FB 0F 86 E2 48 
96 E6 89 A6 EA CA B6 EE  0B C7 F2 4C D7 F6 8D E7 
FA 28 F4 FE 0F EC ED 40  C1 E2 6F F8 31 2A 91 1E 
A5 91 D9 71 16 A1 1C 69  90 BA B1 02 B1 1A ED 91 
8B F1 FA C0 61 B1 80 7C  31 9F D1 15 35 BB 6D 7E 
53 DC 72 09 BD 0E B9 E3  1D FA 3D A3 EF 17 28 38 
48 58 68 78 88 98 A8 B8  C8 D8 E8 F8 08 19 29 39 
49 69 08 70 89 99 A9 B9  C9 79 89 D7 09 1A 8A F9 
29 5A BA 49 6A 9A 0A 80  AA 5A CA DA 1A FA 0A DB 
29 3B 7B 5A 67 2B 5A 9B  3B 8A CB 4B EB FB 7B 2B 
27 CC B9 FB 7B CC 9B 9C  BB 6C DB 3C FB 0C 1B DD 
3A AD 5A 9D 7A 6D 9A ED  1A 5C DC 4B EC 9D 59 39 
4E 5E 6E 7E 8E 9E AE BE  CE DE EE FE 0E 1F 2F 3F 
4F 5F 6F 7F 8F CF 52 00  00 3B 
-----------------------------
其中21 F9 04 04 14 00 FF 00就是图像控制扩充块,
flag是04,即00000100,DisposalMethod是1,Transparency是0,表示没有透明色
wDelayTime 是14 00,即20个单位,0.01秒*20 = 0.2秒
byTransparencyIndex填充的FF,因为没使用嘛。

2.gif,白色透明
---------------------------
47 49 46 38 39 61 64 00  64 00 91 00 00 00 00 FF 
FF FF FF FF 00 00
 00 00  00 21 F9 04 05 14 00 01 
00
 2C 00 00 00 00 64 00  64 00 00 02 DB 8C 8F A9 
CB ED 0F A3 9C B4 DA 8B  B3 DE BC FB 0F 86 E2 48 
96 E6 89 A6 EA CA B6 EE  0B C7 F2 4C D7 F6 8D E7 
FA 28 F4 FE 0F EC ED 40  C1 E2 6F F8 31 2A 91 1E 
A5 91 D9 71 16 A1 1C 69  90 BA B1 02 B1 1A ED 91 
8B F1 FA C0 61 B1 80 7C  31 9F D1 15 35 BB 6D 7E 
53 DC 72 09 BD 0E B9 E3  1D FA 3D A3 EF 17 28 38 
48 58 68 78 88 98 A8 B8  C8 D8 E8 F8 08 19 29 39 
49 69 08 70 89 99 A9 B9  C9 79 89 D7 09 1A 8A F9 
29 5A BA 49 6A 9A 0A 80  AA 5A CA DA 1A FA 0A DB 
29 3B 7B 5A 67 2B 5A 9B  3B 8A CB 4B EB FB 7B 2B 
27 CC B9 FB 7B CC 9B 9C  BB 6C DB 3C FB 0C 1B DD 
3A AD 5A 9D 7A 6D 9A ED  1A 5C DC 4B EC 9D 59 39 
4E 5E 6E 7E 8E 9E AE BE  CE DE EE FE 0E 1F 2F 3F 
4F 5F 6F 7F 8F CF 52 00  00 3B 
-----------------------------
控制块变成了:21 F9 04 05 14 00 01 00
flag是05,即00000101,DisposalMethod是1,Transparency是1,表示有透明色
byTransparencyIndex是01,即颜色表里的第二个颜色,也就是FF FF FF,即白色。

3.gif,红色透明
---------------------------
47 49 46 38 39 61 64 00  64 00 91 00 00 00 00 FF 
FF FF FF FF 00 00 00 00  00 21 F9 04 05 14 00 02 
00
 2C 00 00 00 00 64 00  64 00 00 02 DB 8C 8F A9 
CB ED 0F A3 9C B4 DA 8B  B3 DE BC FB 0F 86 E2 48 
96 E6 89 A6 EA CA B6 EE  0B C7 F2 4C D7 F6 8D E7 
FA 28 F4 FE 0F EC ED 40  C1 E2 6F F8 31 2A 91 1E 
A5 91 D9 71 16 A1 1C 69  90 BA B1 02 B1 1A ED 91 
8B F1 FA C0 61 B1 80 7C  31 9F D1 15 35 BB 6D 7E 
53 DC 72 09 BD 0E B9 E3  1D FA 3D A3 EF 17 28 38 
48 58 68 78 88 98 A8 B8  C8 D8 E8 F8 08 19 29 39 
49 69 08 70 89 99 A9 B9  C9 79 89 D7 09 1A 8A F9 
29 5A BA 49 6A 9A 0A 80  AA 5A CA DA 1A FA 0A DB 
29 3B 7B 5A 67 2B 5A 9B  3B 8A CB 4B EB FB 7B 2B 
27 CC B9 FB 7B CC 9B 9C  BB 6C DB 3C FB 0C 1B DD 
3A AD 5A 9D 7A 6D 9A ED  1A 5C DC 4B EC 9D 59 39 
4E 5E 6E 7E 8E 9E AE BE  CE DE EE FE 0E 1F 2F 3F 
4F 5F 6F 7F 8F CF 52 00  00 3B 
-----------------------------
控制块变成了:21 F9 04 05 14 00 02 00
byTransparencyIndex是02,即颜色表里的第三个颜色,也就是FF 00 00,即红色。

4.gif,蓝色透明
---------------------------
47 49 46 38 39 61 64 00  64 00 91 00 00 00 00 FF 
FF FF FF FF 00 00 00 00  00 21 F9 04 05 14 00 00 
00
 2C 00 00 00 00 64 00  64 00 00 02 DB 8C 8F A9 
CB ED 0F A3 9C B4 DA 8B  B3 DE BC FB 0F 86 E2 48 
96 E6 89 A6 EA CA B6 EE  0B C7 F2 4C D7 F6 8D E7 
FA 28 F4 FE 0F EC ED 40  C1 E2 6F F8 31 2A 91 1E 
A5 91 D9 71 16 A1 1C 69  90 BA B1 02 B1 1A ED 91 
8B F1 FA C0 61 B1 80 7C  31 9F D1 15 35 BB 6D 7E 
53 DC 72 09 BD 0E B9 E3  1D FA 3D A3 EF 17 28 38 
48 58 68 78 88 98 A8 B8  C8 D8 E8 F8 08 19 29 39 
49 69 08 70 89 99 A9 B9  C9 79 89 D7 09 1A 8A F9 
29 5A BA 49 6A 9A 0A 80  AA 5A CA DA 1A FA 0A DB 
29 3B 7B 5A 67 2B 5A 9B  3B 8A CB 4B EB FB 7B 2B 
27 CC B9 FB 7B CC 9B 9C  BB 6C DB 3C FB 0C 1B DD 
3A AD 5A 9D 7A 6D 9A ED  1A 5C DC 4B EC 9D 59 39 
4E 5E 6E 7E 8E 9E AE BE  CE DE EE FE 0E 1F 2F 3F 
4F 5F 6F 7F 8F CF 52 00  00 3B 
-----------------------------
控制块变成了:21 F9 04 05 14 00 00 00
byTransparencyIndex是00,即颜色表里的第一个颜色,也就是00 00 FF,即蓝色。


以上几种情况,除了控制块不同,其它数据完全相同。
只要更改透明色索引,就可以来回切换。


5.gif,红色+蓝色,透明
---------------------------
47 49 46 38 39 61 64 00  64 00 91 00 00 00 00 FF 
FF FF FF FF 00 00 00 00  00 21 F9 04 05 14 00 00 
00
 2C 00 00 00 00 64 00  64 00 00 02 CD 8C 8F A9 
CB ED 0F A3 9C B4 DA 8B  B3 DE BC FB 0F 86 E2 48 
96 E6 89 A6 EA CA B6 EE  0B C7 F2 4C D7 F6 8D E7 
FA 08 F4 FE 0F EC ED 40  C1 E2 6F F8 31 2A 91 1E 
A5 91 D9 71 16 A1 1C 69  90 BA B1 02 B1 1A ED 91 
8B F1 FA C0 61 31 80 7C  31 9F D1 15 35 BB 6D 7E 
53 DC 72 09 BD 0E B9 E3  1D FA 3D A3 EF 17 28 38 
48 58 68 78 88 98 A8 B8  C8 D8 E8 F8 08 19 29 39 
49 69 A8 A6 85 77 69 95  A9 E9 C4 D9 F9 54 07 BA 
24 3A 3A 55 6A BA 85 9A  3A B6 CA BA 26 F7 FA 15 
2B 2B E4 CA FA 29 9B FB  BA 8B 7B 9B DA 0B FC 6B 
1A 4C 3C 3C 5A 8C 7C 0C  9A CC BC DC D9 0C FD AC 
59 59 6D 7D 8D 9D AD BD  CD DD ED FD 0D 1E 2E 3E 
4E 5E 6E 7E 8E 9E AE CE  52 00 00 3B 
-----------------------------
控制块变成了:21 F9 04 05 14 00 00 00
byTransparencyIndex还是00,即蓝色。

除了控制块不同,下面的数据部分也发生了比较大的变化。

说明,fireworks把红色的部分,也当做蓝色来处理了,然后指定蓝色为背景色,

间接实现了,多个颜色都透明。
==================================================

其实,从理论上讲,gif应该支持多种颜色透明的,

一个是透,两个也是透,无所谓的,

但gif结构上只留了一个字节保存透明色,那就没办法了。
===================================
另外,注意,是gif的每个frame可以有一个透明色,每个frame的透明色可以不同。
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved