admin管理员组

文章数量:1130349

一、说明

        Gif文件,是一个极其生动的图片表达方法;它具有时具有很好的渲染效果(如图1),使人耳目一新;有时能使抽象事物具体化(如图2).

图1  数据的渲染效果

图2  抽象的杠杆机械

        因此,能生成gif文件的工具是宝贵的;我们这里介绍两款gif文件生成工具,分别在win10和ubuntu20.04上能轻松产生gif文件 。

二、Gif的基本概念

2.1 gif是个啥?

        Gif:是 Graphics Interchange Format的意思,中文叫“图形交换格式”。

        图形交换格式GIF ; / ɡɪ f / GHIF或/ dʒ ɪ f / JIF,参见发音)是一种位图 图像格式,由美国计算机科学家Steve Wilhite领导的在线服务提供商CompuServe团队开发并发布1987 年 6 月 15 日。

        该格式支持每个图像的每像素最多8 位,允许单个图像引用从24位RGB 颜色空间中选择的最多 256 种不同颜色的自己的调色板。它还支持动画,并允许每帧使用最多 256 种颜色的单独调色板。这些调色板限制使得 GIF 不太适合复制彩色照片和其他具有颜色渐变的图像,但非常适合简单的图像,例如具有纯色区域的图形或徽标。

        GIF 图像使用Lempel-Ziv-Welch (LZW)无损数据压缩技术进行压缩,可在不降低视觉质量的情况下减小文件大小。

        虽然由于其在应用程序和操作系统之间的广泛支持和可移植性,该格式一度在万维网上广泛使用,但由于空间和质量原因,该格式的使用已经减少,通常被视频格式(例如MP4 文件格式)所取代。这些替换通常被称为“GIF”,尽管与原始文件格式无关。

2.2 Gif演进历史

        CompuServe于 1987 年 6 月 15 日推出了 GIF,为其文件下载区域提供彩色图像格式。这取代了早期的游程编码格式,该格式仅为黑白。GIF 之所以流行是因为它使用了        Lempel-Ziv-Welch 数据压缩。由于这比PCX和MacPaint使用的运行长度编码更有效,因此即使使用慢速调制解调器也可以相当快地下载相当大的图像。

        GIF 的原始版本称为 87a。[1]该版本已经支持流中的多个图像。

        1989年,CompuServe发布了增强版本,称为89a,[2]该版本添加了:

  • 支持动画延迟
  • 透明背景颜色
  • 存储特定于应用程序的元数据
  • 允许文本标签作为文本(不将它们嵌入图形数据中)。然而,由于对显示字体的控制很少,因此很少使用此功能。

        这两个版本可以通过查看文件的前六个字节(“幻数”或签名)来区分,当解释为ASCII时,分别读取“GIF87a”或“GIF89a”。

        CompuServe 通过为许多计算机提供可下载的转换实用程序来鼓励 GIF 的采用。例如,到 1987 年 12 月,Apple IIGS用户可以查看在Atari ST或Commodore 64上创建的图片。[4] GIF 是网站上最常用的两种图像格式之一,另一种是黑白XBM。[5]

        1995 年 9 月,Netscape Navigator 2.0 添加了动画 GIF 循环的功能。

        虽然 GIF 是由CompuServe开发的,但它使用了Unisys于 1985 年获得专利的Lempel-Ziv-Welch (LZW)无损数据压缩算法。1994年Unisys和CompuServe之间的许可协议的争议刺激了便携式网络图形(PNG)的发展标准。2004 年,所有与 GIF 专有压缩相关的专利都到期了。

        在一个文件中存储多个图像并附有控制数据的功能在 Web 上广泛用于制作简单的动画。

        可选的隔行扫描功能以一种甚至部分下载的图像也能在一定程度上识别的方式存储图像扫描线,这也有助于 GIF 的流行,[6] 因为如果不是所需的,用户可以中止下载。

        2015 年 5 月,Facebook增加了对 GIF 的支持。[7] [8] 2018年1月Instagram还在故事模式中添加了GIF贴纸。

三、介绍一点 Gif的技术

3.1 文件格式 

        从概念上讲,GIF 文件描述了填充有零个或多个“图像”的固定大小的图形区域(“逻辑屏幕”)。许多 GIF 文件都有一个充满整个逻辑屏幕的图像。其他人将逻辑屏幕划分为单独的子图像。这些图像还可以用作动画 GIF 文件中的动画帧,但这些图像不需要填充整个逻辑屏幕。

        GIF 文件以给出版本的固定长度标头(“GIF87a”或“GIF89a”)开始,后面跟着给出逻辑屏幕的像素尺寸和其他特征的固定长度逻辑屏幕描述符。屏幕描述符还可以指定全局颜色表(GCT)的存在和大小,如果存在则紧随其后。

        此后,文件被分为多个段,每个段由一个 1 字节的标记引入:

  • 图像(由 0x2C 引入,一个 ASCII 逗号','
  • 扩展块(由 0x21 引入,一个 ASCII 感叹号'!'
  • 尾部(值为 0x3B 的单字节,一个 ASCII 分号';'),应该是文件的最后一个字节。

        图像以固定长度的图像描述符开始,它可以指定本地颜色表的存在和大小(如果存在,则紧随其后)。图像数据如下:一个字节给出未编码符号的位宽(即使对于双色图像,也必须至少为 2 位宽),后面是包含 LZW 编码数据的子块的链接列表。

        扩展块(通过 87a 规范中已定义的机制“扩展”87a 定义的块)由标记、指定扩展类型的附加字节以及带有扩展数据的子块链接列表组成。修改图像的扩展块(例如指定可选动画延迟时间和可选透明背景颜色的图形控制扩展)必须紧邻其引用的图像的段之前。

        图像数据和扩展块使用的链表由一系列子块组成,每个子块以给出子块中后续数据字节数的字节开始(1到255)。这一系列子块以空子块(0 字节)结束。

        即使并非所有部分都被理解,此结构也允许解析文件。标记为 87a 的 GIF 可能包含扩展块;目的是解码器可以读取和显示文件,而无需其不理解的扩展名中涵盖的功能。

        GIF 规范涵盖了文件格式的完整细节。

3.2 图像编码 

        从左上角水平扫描的图像像素数据通过LZW 编码转换为代码,然后映射为字节以存储在文件中。像素代码通常与字节的 8 位大小不匹配,因此代码通过“little-Endian”方案打包为字节:第一个代码的最低有效位存储在第二个代码的最低有效位中。第一个字节,将代码的高阶位转换为该字节的高阶位,并根据需要溢出到下一个字节的低阶位。每个后续代码都从尚未使用的最低有效位开始存储。

        该字节流作为一系列“子块”存储在文件中。每个子块的最大长度为 255 字节,并以指示子块中数据字节数的字节为前缀。这一系列子块以空子块(单个0字节,表示具有0数据字节的子块)终止。

对于上面的示例图像,9 位代码和字节之间的可逆映射如下所示。

可逆映射
9位代码字节
十六进制二进制二进制十六进制
1001 000000000000000000
02800 01010000101000 151
0FF011 111111111111 00FC
1031000 0001100011 0111B
10210000 00100010 100028
103100000 011011 1000070
1061000001 1010 100000A0
10710000011 11000001C1
1000001183
1011 000000010000000101
0000000 101

        轻微的压缩是明显的:最初由 15 个字节定义的像素颜色精确地由 12 个代码字节(包括控制代码)表示。产生 9 位代码的编码过程如下所示。本地字符串从调色板中累积像素颜色编号,只要可以在代码表中找到本地字符串,就没有输出操作。对在表通过添加字符串从其初始大小增长之前到达的前两个像素进行特殊处理。在每个输出代码之后,本地字符串被初始化为最新的像素颜色(不能包含在输出代码中)。

                          表 9 位
                     字符串 --> code 代码 Action
                          #0 | 000h 初始化9位代码根表
                    调色板| :
                     颜色 | :
                        第255章 0FFh
                         清除| 100小时
                         结束 | 101小时
                             | 100小时清除
像素本地|
调色板字符串 |
黑色 #40 28 | 028h 始终输出第一个像素
白色 #255 FF | 在表中找到字符串
                  28 FF | 102h 始终将第一个字符串添加到表中
               FF | 初始化本地字符串
白色 #255 FF FF | 在表中找不到字符串
                             | 0FFh - 前一个字符串的输出代码
                  FF FF | 103h - 将最新字符串添加到表中
               FF | - 初始化本地字符串
白色 #255 FF FF | 在表中找到字符串
黑色 #40 FF FF 28 | 在表中找不到字符串
                             | 103h - 前一个字符串的输出代码
                  FF FF 28 | FF FF 28 104h - 将最新字符串添加到表中
               28 | 28 - 初始化本地字符串
白色 #255 28 FF | 在表中找到字符串
白色 #255 28 FF FF | 在表中找不到字符串
                             | 102h - 前一个字符串的输出代码
                  28 FF FF | 28 105h - 将最新字符串添加到表中
               FF | - 初始化本地字符串
白色 #255 FF FF | 在表中找到字符串
白色 #255 FF FF FF | 在表中找不到字符串
                             | 103h - 前一个字符串的输出代码
                  FF FF FF | FF FF FF 106h - 将最新字符串添加到表中
               FF | - 初始化本地字符串
白色 #255 FF FF | 在表中找到字符串
白色 #255 FF FF FF | 在表中找到字符串
白色 #255 FF FF FF FF | 在表中找不到字符串
                             | 106h - 前一个字符串的输出代码
                  FF FF FF FF| 107h - 将最新字符串添加到表中
               FF | - 初始化本地字符串
白色 #255 FF FF | 在表中找到字符串
白色 #255 FF FF FF | 在表中找到字符串
白色 #255 FF FF FF FF | 在表中找到字符串
                                                   不再有像素
                                          107h - 最后一个字符串的输出代码
                                          101小时结束

        为了清楚起见,上面显示的表格是由长度不断增加的字符串组成的。该方案可以发挥作用,但该表会消耗不可预测的内存量。实际上,通过注意要存储的每个新字符串都由先前存储的字符串加上一个字符组成,可以节省内存。在每个地址仅存储两个字是经济的:现有地址和一个字符。

        LZW 算法需要在表中搜索每个像素。线性搜索多达 4096 个地址会使编码速度变慢。实际上,代码可以按数值顺序存储;这允许每次搜索由 SAR(逐次逼近寄存器,如某些ADC中使用的)完成,只需 12 次幅度比较。为了实现这种效率,需要一个额外的表来在代码和实际内存地址之间进行转换;仅当存储新代码时才需要额外的表维护,而这发生的速度远低于像素速率。

四、Gif 使用工具记录

4.1 首先看win10下的版本

         如果,你也想做出GoBeGer的GIF,那么你一定不要错过本期主角----最好用的动图制作工具----ScreenToGif

4.2 官网下载

下载的地址:

ScreenToGif - Record your screen, edit and save as a gif, video or other formats

4.3 下载安装

 下载文件是:

ScreenToGif.2.37.Setup.x64.msi

双击安装。

4.4 双击录像

录像机可以对录像进行编辑。

五、Ubuntu20.04版本的peek

5.1 下载peek版本

        在https://github/phw/peek上下载

        比如:peek-1.5.1-0~ppa28-ubuntu20.04.1_amd64.deb文件

5.2 安装

sudo apt update
sudo apt upgrade
sudo dpkg -i peek-1.5.1-0~ppa28-ubuntu20.04.1_amd64.deb

5.3 使用和效果

        注意,先执行您的被录制程序,然后运行peek,将peek窗口叠加到被执行窗口,这是个透明的叠加,然后点击peek上按钮,界面只有录制GIF、停止,录制之后选择保存路径保存就OK。

运行:

peek

        录制后参考图。  下面是我生成的gif效果图:

六、结论

        在win10和ubuntu上,您的程序若有动态效果,或者想将他人的录像剪切下来,上面介绍了两种比较简单的方法。在需要做ppt或演示手稿时,很有帮助。缺点是没有音频效果。

一、说明

        Gif文件,是一个极其生动的图片表达方法;它具有时具有很好的渲染效果(如图1),使人耳目一新;有时能使抽象事物具体化(如图2).

图1  数据的渲染效果

图2  抽象的杠杆机械

        因此,能生成gif文件的工具是宝贵的;我们这里介绍两款gif文件生成工具,分别在win10和ubuntu20.04上能轻松产生gif文件 。

二、Gif的基本概念

2.1 gif是个啥?

        Gif:是 Graphics Interchange Format的意思,中文叫“图形交换格式”。

        图形交换格式GIF ; / ɡɪ f / GHIF或/ dʒ ɪ f / JIF,参见发音)是一种位图 图像格式,由美国计算机科学家Steve Wilhite领导的在线服务提供商CompuServe团队开发并发布1987 年 6 月 15 日。

        该格式支持每个图像的每像素最多8 位,允许单个图像引用从24位RGB 颜色空间中选择的最多 256 种不同颜色的自己的调色板。它还支持动画,并允许每帧使用最多 256 种颜色的单独调色板。这些调色板限制使得 GIF 不太适合复制彩色照片和其他具有颜色渐变的图像,但非常适合简单的图像,例如具有纯色区域的图形或徽标。

        GIF 图像使用Lempel-Ziv-Welch (LZW)无损数据压缩技术进行压缩,可在不降低视觉质量的情况下减小文件大小。

        虽然由于其在应用程序和操作系统之间的广泛支持和可移植性,该格式一度在万维网上广泛使用,但由于空间和质量原因,该格式的使用已经减少,通常被视频格式(例如MP4 文件格式)所取代。这些替换通常被称为“GIF”,尽管与原始文件格式无关。

2.2 Gif演进历史

        CompuServe于 1987 年 6 月 15 日推出了 GIF,为其文件下载区域提供彩色图像格式。这取代了早期的游程编码格式,该格式仅为黑白。GIF 之所以流行是因为它使用了        Lempel-Ziv-Welch 数据压缩。由于这比PCX和MacPaint使用的运行长度编码更有效,因此即使使用慢速调制解调器也可以相当快地下载相当大的图像。

        GIF 的原始版本称为 87a。[1]该版本已经支持流中的多个图像。

        1989年,CompuServe发布了增强版本,称为89a,[2]该版本添加了:

  • 支持动画延迟
  • 透明背景颜色
  • 存储特定于应用程序的元数据
  • 允许文本标签作为文本(不将它们嵌入图形数据中)。然而,由于对显示字体的控制很少,因此很少使用此功能。

        这两个版本可以通过查看文件的前六个字节(“幻数”或签名)来区分,当解释为ASCII时,分别读取“GIF87a”或“GIF89a”。

        CompuServe 通过为许多计算机提供可下载的转换实用程序来鼓励 GIF 的采用。例如,到 1987 年 12 月,Apple IIGS用户可以查看在Atari ST或Commodore 64上创建的图片。[4] GIF 是网站上最常用的两种图像格式之一,另一种是黑白XBM。[5]

        1995 年 9 月,Netscape Navigator 2.0 添加了动画 GIF 循环的功能。

        虽然 GIF 是由CompuServe开发的,但它使用了Unisys于 1985 年获得专利的Lempel-Ziv-Welch (LZW)无损数据压缩算法。1994年Unisys和CompuServe之间的许可协议的争议刺激了便携式网络图形(PNG)的发展标准。2004 年,所有与 GIF 专有压缩相关的专利都到期了。

        在一个文件中存储多个图像并附有控制数据的功能在 Web 上广泛用于制作简单的动画。

        可选的隔行扫描功能以一种甚至部分下载的图像也能在一定程度上识别的方式存储图像扫描线,这也有助于 GIF 的流行,[6] 因为如果不是所需的,用户可以中止下载。

        2015 年 5 月,Facebook增加了对 GIF 的支持。[7] [8] 2018年1月Instagram还在故事模式中添加了GIF贴纸。

三、介绍一点 Gif的技术

3.1 文件格式 

        从概念上讲,GIF 文件描述了填充有零个或多个“图像”的固定大小的图形区域(“逻辑屏幕”)。许多 GIF 文件都有一个充满整个逻辑屏幕的图像。其他人将逻辑屏幕划分为单独的子图像。这些图像还可以用作动画 GIF 文件中的动画帧,但这些图像不需要填充整个逻辑屏幕。

        GIF 文件以给出版本的固定长度标头(“GIF87a”或“GIF89a”)开始,后面跟着给出逻辑屏幕的像素尺寸和其他特征的固定长度逻辑屏幕描述符。屏幕描述符还可以指定全局颜色表(GCT)的存在和大小,如果存在则紧随其后。

        此后,文件被分为多个段,每个段由一个 1 字节的标记引入:

  • 图像(由 0x2C 引入,一个 ASCII 逗号','
  • 扩展块(由 0x21 引入,一个 ASCII 感叹号'!'
  • 尾部(值为 0x3B 的单字节,一个 ASCII 分号';'),应该是文件的最后一个字节。

        图像以固定长度的图像描述符开始,它可以指定本地颜色表的存在和大小(如果存在,则紧随其后)。图像数据如下:一个字节给出未编码符号的位宽(即使对于双色图像,也必须至少为 2 位宽),后面是包含 LZW 编码数据的子块的链接列表。

        扩展块(通过 87a 规范中已定义的机制“扩展”87a 定义的块)由标记、指定扩展类型的附加字节以及带有扩展数据的子块链接列表组成。修改图像的扩展块(例如指定可选动画延迟时间和可选透明背景颜色的图形控制扩展)必须紧邻其引用的图像的段之前。

        图像数据和扩展块使用的链表由一系列子块组成,每个子块以给出子块中后续数据字节数的字节开始(1到255)。这一系列子块以空子块(0 字节)结束。

        即使并非所有部分都被理解,此结构也允许解析文件。标记为 87a 的 GIF 可能包含扩展块;目的是解码器可以读取和显示文件,而无需其不理解的扩展名中涵盖的功能。

        GIF 规范涵盖了文件格式的完整细节。

3.2 图像编码 

        从左上角水平扫描的图像像素数据通过LZW 编码转换为代码,然后映射为字节以存储在文件中。像素代码通常与字节的 8 位大小不匹配,因此代码通过“little-Endian”方案打包为字节:第一个代码的最低有效位存储在第二个代码的最低有效位中。第一个字节,将代码的高阶位转换为该字节的高阶位,并根据需要溢出到下一个字节的低阶位。每个后续代码都从尚未使用的最低有效位开始存储。

        该字节流作为一系列“子块”存储在文件中。每个子块的最大长度为 255 字节,并以指示子块中数据字节数的字节为前缀。这一系列子块以空子块(单个0字节,表示具有0数据字节的子块)终止。

对于上面的示例图像,9 位代码和字节之间的可逆映射如下所示。

可逆映射
9位代码字节
十六进制二进制二进制十六进制
1001 000000000000000000
02800 01010000101000 151
0FF011 111111111111 00FC
1031000 0001100011 0111B
10210000 00100010 100028
103100000 011011 1000070
1061000001 1010 100000A0
10710000011 11000001C1
1000001183
1011 000000010000000101
0000000 101

        轻微的压缩是明显的:最初由 15 个字节定义的像素颜色精确地由 12 个代码字节(包括控制代码)表示。产生 9 位代码的编码过程如下所示。本地字符串从调色板中累积像素颜色编号,只要可以在代码表中找到本地字符串,就没有输出操作。对在表通过添加字符串从其初始大小增长之前到达的前两个像素进行特殊处理。在每个输出代码之后,本地字符串被初始化为最新的像素颜色(不能包含在输出代码中)。

                          表 9 位
                     字符串 --> code 代码 Action
                          #0 | 000h 初始化9位代码根表
                    调色板| :
                     颜色 | :
                        第255章 0FFh
                         清除| 100小时
                         结束 | 101小时
                             | 100小时清除
像素本地|
调色板字符串 |
黑色 #40 28 | 028h 始终输出第一个像素
白色 #255 FF | 在表中找到字符串
                  28 FF | 102h 始终将第一个字符串添加到表中
               FF | 初始化本地字符串
白色 #255 FF FF | 在表中找不到字符串
                             | 0FFh - 前一个字符串的输出代码
                  FF FF | 103h - 将最新字符串添加到表中
               FF | - 初始化本地字符串
白色 #255 FF FF | 在表中找到字符串
黑色 #40 FF FF 28 | 在表中找不到字符串
                             | 103h - 前一个字符串的输出代码
                  FF FF 28 | FF FF 28 104h - 将最新字符串添加到表中
               28 | 28 - 初始化本地字符串
白色 #255 28 FF | 在表中找到字符串
白色 #255 28 FF FF | 在表中找不到字符串
                             | 102h - 前一个字符串的输出代码
                  28 FF FF | 28 105h - 将最新字符串添加到表中
               FF | - 初始化本地字符串
白色 #255 FF FF | 在表中找到字符串
白色 #255 FF FF FF | 在表中找不到字符串
                             | 103h - 前一个字符串的输出代码
                  FF FF FF | FF FF FF 106h - 将最新字符串添加到表中
               FF | - 初始化本地字符串
白色 #255 FF FF | 在表中找到字符串
白色 #255 FF FF FF | 在表中找到字符串
白色 #255 FF FF FF FF | 在表中找不到字符串
                             | 106h - 前一个字符串的输出代码
                  FF FF FF FF| 107h - 将最新字符串添加到表中
               FF | - 初始化本地字符串
白色 #255 FF FF | 在表中找到字符串
白色 #255 FF FF FF | 在表中找到字符串
白色 #255 FF FF FF FF | 在表中找到字符串
                                                   不再有像素
                                          107h - 最后一个字符串的输出代码
                                          101小时结束

        为了清楚起见,上面显示的表格是由长度不断增加的字符串组成的。该方案可以发挥作用,但该表会消耗不可预测的内存量。实际上,通过注意要存储的每个新字符串都由先前存储的字符串加上一个字符组成,可以节省内存。在每个地址仅存储两个字是经济的:现有地址和一个字符。

        LZW 算法需要在表中搜索每个像素。线性搜索多达 4096 个地址会使编码速度变慢。实际上,代码可以按数值顺序存储;这允许每次搜索由 SAR(逐次逼近寄存器,如某些ADC中使用的)完成,只需 12 次幅度比较。为了实现这种效率,需要一个额外的表来在代码和实际内存地址之间进行转换;仅当存储新代码时才需要额外的表维护,而这发生的速度远低于像素速率。

四、Gif 使用工具记录

4.1 首先看win10下的版本

         如果,你也想做出GoBeGer的GIF,那么你一定不要错过本期主角----最好用的动图制作工具----ScreenToGif

4.2 官网下载

下载的地址:

ScreenToGif - Record your screen, edit and save as a gif, video or other formats

4.3 下载安装

 下载文件是:

ScreenToGif.2.37.Setup.x64.msi

双击安装。

4.4 双击录像

录像机可以对录像进行编辑。

五、Ubuntu20.04版本的peek

5.1 下载peek版本

        在https://github/phw/peek上下载

        比如:peek-1.5.1-0~ppa28-ubuntu20.04.1_amd64.deb文件

5.2 安装

sudo apt update
sudo apt upgrade
sudo dpkg -i peek-1.5.1-0~ppa28-ubuntu20.04.1_amd64.deb

5.3 使用和效果

        注意,先执行您的被录制程序,然后运行peek,将peek窗口叠加到被执行窗口,这是个透明的叠加,然后点击peek上按钮,界面只有录制GIF、停止,录制之后选择保存路径保存就OK。

运行:

peek

        录制后参考图。  下面是我生成的gif效果图:

六、结论

        在win10和ubuntu上,您的程序若有动态效果,或者想将他人的录像剪切下来,上面介绍了两种比较简单的方法。在需要做ppt或演示手稿时,很有帮助。缺点是没有音频效果。

本文标签: GIF