首先,多处的文章(包括微软的文章)都提到,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 002C 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的透明色可以不同。
|