GIF(Graphics Interchange Format) 一种主要用于动画和图形图像的图像格式。与 JPEG 格式类似,GIF 也是一种光栅图像格式。它本质上是一个位图图像文件。它基本上是位图或空间映射的位数组。位图图像文件使用以某种方式排列的不同颜色像素来显示图像。
1 发展历程
GIF 格式当时由CompuServe公司开发出来作为一种网络上的图像格式。以下是GIF格式的主要发展历程:
最初的GIF格式 (1987年): 最初的GIF格式是一种无压缩的图像格式,用于在计算机和网络之间交换图像。该格式仅支持最多256种颜色,并且不能支持透明度和动画。
GIF 87a格式 (1989年): 1989年,CompuServe发布了GIF 87a格式,支持帧动画和图像透明度。该格式还支持LZW压缩算法,可以将文件大小减小到原始大小的70%。
GIF 89a格式 (1990年): 1990年,GIF 89a格式被引入,使得GIF格式可以支持更多的颜色。它还引入了图像间隔、循环次数和文本扩展等新特性。
Unisys专利 (1994年): 1994年,Unisys公司获得了与LZW压缩算法相关的专利,这导致其他公司需要为使用GIF格式而支付许可费用。这导致了一些争议,因为许多人认为GIF应该是一种开放的格式。
PNG格式 (1996年): 1996年,PNG (Portable Network Graphics) 格式被开发出来,以取代GIF格式。PNG支持更多的颜色和透明度,而且没有专利限制,因此逐渐取代了GIF格式的使用。
GIF格式复兴 (2010年): 2010年,GIF格式经历了一次复兴,成为社交媒体上广受欢迎的图像和动画格式。这主要是由于社交媒体平台,如Tumblr和Twitter,开始支持GIF格式的自动播放。
2 JPEG VS GIF
3 gif特点
GIF格式的图像文件具有如下特点:文件结构,具有Gif87a和gif89a两个版本;采用lzw无损压缩算法; 调色板数据有通用调色板和局部调色板之分,最多存储256色
3.1 文件结构
从概念上讲,GIF 文件描述了一个固定大小的图形区域(“逻辑屏幕”),其中填充了零个或多个“图像”
如下博文有比较详实的介绍,大家可以参考一下,自己整理了一个脑图,方便自己的理解:
https://www.cnblogs.com/think/archive/2006/04/12/372942.html
gif87a和gif89a对应的原文可以参考如下链接:
https://www.w3.org/Graphics/GIF/spec-gif87.txt
https://www.w3.org/Graphics/GIF/spec-gif89a.txt
3.2 lzw算法
LZW压缩算法是一种在文本数据中实现无损压缩的算法。它的核心原理是利用已经出现过的字符序列进行编码,来替代相同的字符序列,在达到更高效的压缩结果的同时不会丢失原有信息。
https://courses.cs.duke.edu/spring03/cps296.5/papers/ziv_lempel_1978_variable-rate.pdf
算法流程大致如下:
第一步:将所有可能出现的字符构建成一个字典,通过将每个字符映射为唯一的数值进行编码。
第二股:遍历要被压缩的文本数据,将出现过的字符逐个组合成一个字符串,并检查这个字符串是否已经出现在字典中。
如果此前没有出现过,就将其添加到字典中并输出当前字符的编码。
如果已经存在,就继续往后读取字符,形成更长的字符串并继续检查直到找到不存在的字符串,然后将其加入到字典中,并输出之前最长匹配的字符串的编码。这样可以将较长重复出现的字符串转换为较短的编码,从而达到压缩数据的效果。
function compress(uncompressed):
dictionary = { }
for i from 0 to 255:
dictionary[i] = i
current = ''
result = []
for c in uncompressed:
if current + c in dictionary:
current = current + c
else:
result.append(dictionary[current])
dictionary[current + c] = len(dictionary)
current = c
if current != '':
result.append(dictionary[current])
return result
压缩过程中,先初始化字典为包含ASCII码表中所有字符,遍历未压缩的数据流,查找当前字符与已有字典是否匹配,如果匹配就将当前字符作为前缀继续查找下一个字符,如果不匹配就将当前前缀在字典中的编码输出,并将当前前缀加上下一个字符添加进字典,然后重置前缀为下一个字符。最后将剩余的前缀编码输出。
function decompress(compressed):
dictionary = { }
for i from 0 to 255:
dictionary[i] = i
old = compressed[0]
result = [old]
current_sequence = ''
for code in compressed[1:]:
if code in dictionary:
sequence = dictionary[code]
elif code == len(dictionary):
sequence = old + old[0]
else:
raise ValueError('Bad compressed code: %s' % code)
current_sequence = old + sequence[0]
result.append(sequence)
dictionary[len(dictionary)] = old + sequence[0]
old = sequence
return "".join(result)
解压缩过程是对于经过 LZW 压缩的编码序列,先按照压缩算法初始化字典,首先读入第一个字符,作为解压的第一个字符,然后依次读入编码序列中的编码,如果编码在字典中则直接将其转换成字符,否则根据该编码对应的前缀在字典中解压缩,然后将前缀加上解压缩的结果的第一个字符添加进字典,最后更新前缀为该编码对应的字符串。
由于LZW算法需要预先建立字典,因此先前建立字典的方法对压缩率也产生了影响,但相对于其简单的操作步骤和良好的压缩效果,LZW算法已经成为了一种常见的文本数据压缩算法。
lzw视频教学:
https://www.bilibili.com/video/BV1ds411W7sX/?spm_id_from=333.999.0.0&vd_source=163a3a57e22bc77006538724777dd866
3.3 调色板
调色板中的颜色定义可以从数百万色调的颜色空间中提取(2 24色调,每个原色 8 位),但一帧最多可以使用 256 种颜色。
GIF图像格式采用调色板技术,根据设定的颜色表中的索引值来表达图像的颜色信息。具体来说,它通过减少颜色数量来实现数据的压缩,从而降低存储和传输文件的大小,达到以较小的确定性换取较高的压缩效率。在开发 GIF 时,受到当时整体大环境的限制,这种规范似乎是合理的,毕竟很少有人能负担得起同时显示更多颜色的硬件。所以简单的图形、线条图、卡通和灰度照片通常需要少于 256 种颜色。同时辅助lzw的无损压缩,可以实现较好的灰度图像的压缩和成像效果。
gif调色板有两种,全局调色板和局部调色板:
全局调色板(Global Color Table)
一个GIF图像只包含一个全局调色板。它被存储在GIF文件的文件头中,用于定义该图像中可用的所有颜色。全局调色板最多包含256种颜色,Indexed色彩模型采用24位调色板,共能够表示16,777,216色中的256个。
局部调色板(Local Color Table)
如果GIF图像包含多帧动画,则每一帧可以使用自己的局部调色板。局部调色板只在当前帧使用,并在图像解码完成后立即销毁。使用局部调色板的好处是可以将颜色金额控制到最小,以便在某些情况下提高像素密度,同时存储空间得到有效利用。
4 gif的工具
4.1 ScreenToGif
ScreenToGif 是一个免费开源的轻量级工具,它可以用于创建屏幕捕获、录制 Gif 动画。
易于使用:界面风格简洁,所有功能都在同一个用户界面内。可以轻松地捕捉屏幕动画并将其转换成GIF文件。
支持多种导出格式: 除了GIF格式,还支持 MP4, WebM 等常见格式。
高度定制化: 可以根据需要更改颜色、字体和录制参数来自定义您想要的GIF图像。
https://www.screentogif.com/
4.1 GIF Brewery
GIF Brewery是一款Mac上的应用程序,可轻松制作高质量、专业级的 GIF 动画图像。它提供了直观、易于使用的用户界面、多达数十秒甚至数分钟的录屏时间、以及强大的编辑功能。可以添加更改大小、重命名文件和非常完善的编辑和调整选项。此外,GIF Brewery 还支持在 GIF 中分割合成视频,保存格式包括 WebM 和 h.264 等,并支持调整噪音、色彩饱和度、亮度和对比度等细节。最重要的是,GIF Brewery 没有任何广告,并且还带有预设快捷键,为 Mac 用户提供方便的操作体验。
https://gfycat.com/gifbrewery
https://sspai.com/post/31706
作者:MediaStack一枚爱跑步的程序员,音视频开发工程师,知乎专栏和公众号同名《MediaStack》,热衷分享Android音视频相关内容,一起交流学习音视频开发、职场。
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。