众所周知,GIF文件的像素使用8位位图来表示,8位位图有一个调色板,调色板包含8位颜色即256中颜色,图片数据只存储调色板的各种颜色的下标,在显示时图片的某个像素时通过下标在调色板中找到该下标的颜色即为该像素的颜色。
那么有很多GIF支持局部透明是怎么实现的呢?我们在程序中应该怎么处理来获得像素的透明信息呢?
其实,在我们解析完GIF后,发现每一帧数据里包含一个背景色的字段,这个背景色也是使用调色板中的颜色,这个字段只是该帧的调色板的某个下标。比如255,说明背景色是panel【255】,那么在透明的gif处理的时候我们把图片数据中所有颜色获取到,然后只要某个像素的颜色等于panel[255]那么就代表这个像素是完全透明的。实则不然,通过实现我发现有很多部分显示不正确,不该透明的地方被透明了。后来经过了解和尝试,发现所谓透明色,不是说把调色板中的像素颜色拿来比较,而是调色板的下标之间的比较。
因为调色板中的颜色不一定256种颜色都是各不相同的,有很多颜色都是重复的,比如会出现下标是255的颜色会跟100的颜色完全相同。某个像素是否透明应该根据该像素数据的调色板下标来确定。比如背景色字段是255,而图片某个像素的下标也是255那么这个像素透明,某个像素下标是100,它代表的颜色即使跟背景色完全相同它也是不透明的。