最新教程
  • gif图片格式太大怎么将其压缩缩小呢?

  • 怎么给心爱的gif动图打上专属水印?

  • 看到好看的画面想要截取下来做gif该怎么办?

  • 教你怎么合成一张漂亮的花海gif动图

  • 怎么制作一张美图GIF?

  • 一大波进度条gif来袭,是时候收藏起来了!

热门教程
  • 如何解决gif图片太大无法发送到微信问题?

  • 教你免费制作gif,不用花钱买

  • 教你怎么快速制作微信gif动图

  • 原来视频转gif这么简单!

  • 看到搞笑的画面怎么办?把它制成gif图!

  • 怎么把喜欢的视频截取一段做gif欣赏呢?

相关教程
  • 零基础轻松搞定GIF动画制作

  • 动态广告制作难吗?现在有个机会你要不要学?

  • 为什么别人制作的gif帧数多画质又好?

  • 给gif动图添加文字只要怎么简单可以完成!

  • 一大波进度条gif来袭,是时候收藏起来了!

  • 为什么人们喜欢Gif图?如何制作?

详细说说gif的构造和压缩原理

2021-03-10 14:57:55


GIF全称GraphicsInterchangeFormat,原意是图像交换格式。可采用LZW压缩算法编码。无损,采用索引色,点阵图。小型文件是GIF格式的优势,同时GIF格式也具有支持动画化和透明化的优势。但GIF格式格式只支持8bit的索引色,即整个图片中只有256种不同的颜色。对于对颜色要求不高的文件来说,GIF非常适合。对GIF的理解不能停留在动画的概念上,动画就是GIF中的一个。GIF一样可以展示静态图像。

gif图片

如下图所示,GIF文件格式有11个组件,其中实线框是必需的组件,另外3个虚线框是可选的块。
八个必要组成部分:
三个可选组成部分:Header、LogicalScrenDescriptor(逻辑画面说明符)、ImageData(图像数据流)、PlainTextension(文本扩展)、Application(应用扩展)、Comentextension(注释扩展)、Trailer(尾部标记)
GlobalColorTable(全raphicControlextension(图形控制扩展)、LocalColorTable(数据块的数据由上一个控制块的参数说明。如图所示:
“GIF89a”GIF是GIF的签名,89a表示不同年份的版本号“0A000A00B30000”:其中第一个0A00表示图像宽度,第二个0A00表示图像高度。B3表示压缩字节,第一个00表示背景颜色索引,第二个00表示像素的宽高比。GIF动画的动画原理GIF动画循环次数由应用程序扩展控制,GIF动画每帧变换由图形控制,绘制区域由图像描述控制。在图形控制扩展中控制动画的参数分别是disposalmethod、userinputflag、delaytime、transparencycolor。

disposalmethod:disposalmethod=1:解码器不清洁画布,直接在下一个图像中渲染上一个图像的disposalmethod=2:解码器用背景颜色清洁画布,然后渲染下一个图像。在逻辑画面描述符中设置背景颜色disposalmethod=3:解码器将画布设置为上述状态,渲染下一个图像disposalmethod=4-7:约定值userinputflag:userinputflag为1时,GIF将在用户输入事件(鼠标、键盘)时切换到下一个图像。delaytime:delaytime:占用两个字节,为无符号整数,控制当前框架的展示时间,单位为0.01秒。Transparencycolor:如果图形控制扩展的透明色标志位置为1,解码器通过透明色索引在颜色列表中找到变色,并将其标记为透明色,而透明色不会在渲染图像时绘制,显示以下背景。GIF特别是,即使保存多帧图像,也不会太大。这是因为相邻帧之间没有太大的差异,所以不需要改变局部图像块,重复使用,存储压力变小了。

gif图片

GIF的压缩,如果不追求无损,可以牺牲图像的色彩丰富度,单独保存黑白相间的效果,可以更大程度的压缩图像。减少GIF存储有两种方法
减少颜色值,降低图像的颜色丰富度,减少各像素点的占有率,减少颜色,减少感觉图像单一朴素的帧数,减少总存储量,减少帧数,视觉跳跃卡尔顿,效果不太光滑的LZW压缩算法LZW算法又称串行压缩算法,通过制作文字串行表,用短代码表示长的文字串行压缩。LZW算法将字符串映射到一个表中,并与表中的代码相对应,从而减小字符串的总长度。LZW压缩有三个重要对象
编码表对数据过程进行编码时,数据过程为输入对象,编码过程为输出对象。解码时,代码流是输入对象,数据流是输出对象。编码与解码的转换标准基于编译表。LZW压缩算法的基本思想是从数据中提取不同的文本,根据文本生成编译表,利用编译表中的文本索引替换原始数据中的文本,从而减小原始数据流的大小。需要指出的是,编译表并没有在压缩之前生成,而是在压缩期间动态生成的,这在下面提到。
举例来说,下面是字符串:
重复的子序列ABABABAB。如图所示:
参考表格得出以下结论:
关于为什么第一个AB没有直接用2来表示,有同学会疑问,这实际上是LZW算法的一个流程,A和B首先被添加到映射表中,而AB在完成A、B的识别之后,才记录了AB的组合,因此当第一个AB在进行映射时,表内没有AB的组合,只能用A、B两个对应的结果来标识。然后在映射表中记录AB值,以便于直接表示。
注:这里使用0,1,2只是为了更简单的介绍,LZW使用的是ASCII值。LZW能够在数据流中连续地重复出现的字节或字串实现很高的压缩比。除了可应用于图像压缩外,LZW还可应用于文本压缩,其自身处理数据也是如此。
它是一种bitmap位图格式,包含了丰富的图像信息,但几乎不需要压缩,这就造成了它占用磁盘空间过大的缺点,在单片机中得到了广泛的应用。通常BMP没有采用任何压缩,因此BMP占用大量的空间。可将BMP分为两类:
(a)设备相关位图(DDB)设备无关位图(DIB)DIB位图(DIB)包含下列颜色和尺寸信息:
原装(也就是产生图片的设备)的颜色格式;原装设备的分辨率;原装设备的调色板;以红、绿、蓝(RGB)三种数值表示1像素的位数组;一个表示数据压缩方案(如有必要)的数组压缩标志,设备相关位图(DDB)设备相关位图(DDB)现在仍然得到系统支持,只是为了与旧的Windows3.0软件兼容,如果程序员现在开发一个与位图有关的程序,那么就应该尽量使用或生成DIB格式的位图。一个DDB位图由一个BITMAP结构描述,该结构的成员指明了该位图的宽度、高度、设备颜色格式等信息。BMP的构成BMP主要包括四个部分:
位图头文件数据结构:BMP图像文件类型,显示内容等;位图信息数据结构:宽高,压缩算法等;调试板:BMP部分需要调试板,BMP部分是真正的彩色图(24bit),不需要调色板;位图数据:(24bit)使用RGB格式,以及调色板对应的颜色索引值。bmp文件头typedefstructtagBITMAPFILEHEADER{WORDbfType;//位图文件的类型,必须为BMDWORDbfSize(1-2字节)DWORDbfSize;//位图文件的大小,单位为0(3-6字节)DWORDbfOffBits;//位图文件保留字,单位为0(7-8字节)WORDbfReserved2;//位图文件保留字,单位为0(9-10字节)DWORDbfOffBits;//位图数据的开始位置,以相对于位图(11-14字节,低位在前)//文件头的偏移表示,即:
bmp信息头typedefstructtagBITMAPINFOHEADER{DWORDbiSize;//本结构的用字节数(15-18字节)LONGbiWidth;//位图的宽度,LONGbiHeight,LONGbiHeight,LONGbiDbiSize;//位图压缩类型,LONGbiHeight,LONGbiDbiSize,LONGbiDbiSize,WORDBitCount,WORDbiDbiBitCount,WORDbiDBitCount,WORDbiDBitCount,WORDBitCount,WORDBitCount,WORDBitCount,WORCount,WORDbiDBitCount,WORCount,WORCount,WORCount,WORCount,WORCount,WORCount,WORCount,WOR
bmp颜色表typedefstructtagRGBQUAD{BYTErgbBlue;//蓝色亮度(值范围为0-255)BYTErgbGreen;//绿色亮度(值范围为0-255)BYTErgbRed;//红色亮度(值范围为0-255)BYTErgbReserved;//保留,必须是0}__attribute__(packed))RGBQUAD;BMP位图数据位图数据记录位图的每个像素值,记录次序是从左到右,扫描行之间是从下到上。比特图象素之一值所占的字节数:
在biBitCount=1时,8个像素占1个字节;在biBitCount=4时,2个像素占1个字节;在biBitCount=8时,1个像素占1个字节;在biBitCount=24时,1个像素占3个字节,顺序依次为B,G,R;Windows规定扫描行的字节数必须是4的倍数(即,以long为单位),不足的填0。
即JPEG(JointPhotographicExpertsGroup),即JPEG(JPEG)。在因特网上,JPEG是存储和传输图像的常用方法。但这种格式并不适用于绘制线条、文本或图标,因为JPEG的压缩方式常常会严重影响图像的质量。在PNG、GIF中,虽然GIF仅支持8bit的颜色,但对于色彩丰富的图片来说,GIF是更好的选择。