在vc里使gif背景透明

转自:

最近一直被一个问题困扰,那就是如何在vc里使gif背景透明。今天终于把问题搞明白了。由于是在已经有保存gif文件功能的代码上修改,所以只要添加和修改很少的一点内容就可以了。gif文件有两种格式“87a”和“89a”,后者才支持背景透明。所以,要先将原来填有“87a”的内容改为了“89a”。然后

就是最关键的一步:设置对应背景透明功能的参数项。在这里要添加一个“图形控制补充区(Graphic

Control Extension)”,它的结构如下:

 

Graphic Control Extension Block

Offset       Length       Contents

(数据位置)   (数据长度)   (数据内容)
  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;

p3 =  (short *)(lp1+13+NumColors * 3);
p3 =  (short *) lp1+13+NumColors * 3;


GIF格式说明我参阅了:《探索图像文件的奥妙》一书,以及以下的链接

http://www.onicos.com/staff/iz/formats/gif.html

http://baike.360.cn/wiki/index.php?c=show&a=version&wid=4111369&hid=11610071


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值