(数据位置) (数据长度) (数据内容) 0 1 byte Extension Introducer (0x21) 1 1 byte Graphic Control Label (0xf9) 2 1 byte Block Size (0x04) 3 1 byte Packed Field bit 7..5: Reserved bit 4..2: Disposal Method bit 1: User Input Flag bit 0: Transparent Color Flag 4 2 bytes Delay Time (1/100ths of a second) 6 1 byte Transparent Color Index 7 1 byte Block Terminator(0x00)
根据自己的需要,将“Packed Field”一项设置为“0x01”,由于是要背景透明,因此把“Transparent Color Index”的值与GIF表头数据中的“BackgroundColor”设为相同,那么生成的gif图就为背景透明的。同理,需要哪个颜色透明就将该颜色的索引值赋给“Transparent Color Index”。根据格式规定,结合实际情况,我将“图形控制补充区”写在“GIF表头区”和“通用调色板”的后面,“图像数据区”的前面。
这次用了这么半天才搞定,主要是两个小问题没搞清楚,由于一个资料的误导,一直以为“Transparent Color Flag”是“Packed Field”中的bit 7,后来才发现应该是bit 0(至少windows系统里是这样),另外一个就是自己的疏忽,在设定指针位置的时候,数据类型转换时没太注意,导致位置有误,“图形控制补充区”设置失效。毕竟下面的两个行代码,虽然只差了个括号,但得到的结果是不一样的, 以后可要少犯这种低级错误。
unsigned char *lp1; unsigned char *lp2; short *p3;