不少图片处理软件都有一种功能:用户上传一张静态照片,然后可以从软件提供的一些动态图片(gif)选择一种,常见的是相框之类的,和静态图片合成,得到新的动态图片。这就是GIF和静态图片的叠加。
要实现上面的功能,思路还是比较清晰的。GIF图片格式可以看成是多个单帧图片的组合,从GIF图中提取每一帧图片,和静态图混合,最终再将混合后的n张图片组合成GIF。
在实际操作中,涉及到GIF的格式,GIF的拆分,图片混合,真彩色转256色,图片效果优化,GIF组合等。
首先介绍下GIF的格式
GIF图象是基于颜色列表的(存储的数据是该点的颜色对应于颜色列表的索引值),最多只支持8位(256色)。GIF文件内部分成许多存储块,用来存储多幅图象或者是决定图象表现行为的控制块,用以实现动画和交互式应用。GIF文件还通过GIF-LZW压缩算法压缩图象数据来减少图象尺寸。
GIF图像格式
大致分为三部分:文件头、GIF数据流、文件结尾
1.文件头
1.1GIF署名:由三个字节组成,固定为G、I、F,表示这是一张GIF图
1.2版本号:由三个字节组成,值为87a或89a。89a版本增加了一些扩展块,现在使用的GIF是89a版本
2.文件结尾
2.1文件终结器:1个字节,固定值0x3b,标识GIF图结束。
3.GIF数据流
这是最大的一块,描述了GIF的全局信息,以及每一帧GIF的信息
3.1控制块
3.1.1逻辑屏幕标识符
共7个字节,记录一些全局的信息。wWidth:GIF图像宽度,2Byte
wDepth:GIF图像高度,2Byte
Globalflag:1Byte
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
GlobalPal |
ColorRes |
SortFlag |
PalBits |
||||
是否有全局调色板 |
ColorRes+1表示色彩深度 |
全局调色板中的RGB颜色值是否按照使用率进行从高到底的 次序排序的 |
全局调色板的位数 |
byBackground:1Byte