gif格式属于什么文件的存储格式(gif格式图片是什么意思)

本文主要介绍gif格式属于什么文件存储格式(gif格式图片是什么意思)?,下面一起看看gif格式属于什么文件存储格式(gif格式图片是什么意思)?相关资讯。
没错,我指的是遍布网络的主流的、普通的gif,像谷歌旗下的tenor或者脸书旗下的giphy这样的网站,这样的gif比比皆是。gif是每个人 最喜欢分享短漫画的文件格式。
大多数人眼中的gif正如大多数人所知,gif是一种动画文件格式。你可能看到过gif文件的信息,你觉得这些文件真的很大。也许你看完会觉得:哇,这些图的清晰度好低。但无论如何,说到gif,你对它的印象应该是一个简短的动画文件格式。
然而,这个用例与编写gif的开发人员所期望的大相径庭。在本文中,我们将了解更多关于gif文件的结构,并讨论这个过程中一些有趣的功能。
请注意,本文是探讨如何理解gif格式的主题,并考察其一些更深刻的特性。如果你想深入学习如何解析gif文件,我推荐以下资源。
w3规范马修弗利金格:什么 gif中的s?我发现ntfs.com 的指南也可以帮助我开始写文章。我实际上是用这些资源做了一个勉强符合要求的gif解析器,叫做awfulgif,可以解析一些gif。我不 不建议使用它。
让 让我们言归正传。
gif的历史gif文件格式是由compuserve在1987年创建的。在1987年,gif是一种相当紧凑的格式!它使用的压缩方法,而且不是一般的压缩方法,而是lzw压缩技术。许多旧的文件格式(其中一些是由compuserve制作的)使用rle(游程编码),这在许多情况下不是很有效。gif的一个重要制胜因素就是它良好的压缩比和色域(全是256色,太棒了!)。(注1)
两年后,补充内容(gif 89 a)被添加到gif文件格式中,增加了许多我们今天都知道和喜爱的功能。
通过gif89a规范,我们可以快速总结出gif89和gif87a所支持的所有特性的区别。
附录a。快速参考表。块名要求标签扩展名。vers。应用扩展选项。(*) 0xff (255)是89a备注扩展选项。(*) 0xfe (254)是89a全球颜色表选项。(1)无87号图形控制扩展选项。(*) 0xf9 (249)是89a表头请求。(1)无无n/图像描述符选项。(*) 0x2c (044) no 87a (89a)本地颜色表选项。(*)无无87逻辑屏幕描述符请求。(1)无无87a (89a)纯文本扩展选项。(*) 0x01 (001)是89a收发器请求。(1) 0x3b (059)第87号无标签块标题请求。(1)无无逻辑屏幕描述符请求。(1)无编号87a (89a)全局颜色表选项。(1)无87号本地颜色表选项。(*)none no 87图形渲染块显示文本扩展选项。(*) 0x01 (001)是89图像描述符选项。(*) 0x2c (044) no 87a (89a)控制块图形控制扩展选项。(*) 0xf9 (249)是89特殊用途块限制请求。(1)0x3b(059)87a号建议扩展选项。(*) 0xf:(1)如果存在,最多出现一次(*)零次或多次出现( )一次或多次出现国家教育中心为那些没有。;不要阅读整个说明书,其中的大部分内容可以说是不知所云,所以让 让我们讨论一下gif是如何放在一起的,并谈谈它的一些奇怪之处。
在我们开始之前,让 让我们从规范中寻找乐趣。
附录d .公约。动画——图形交换格式并不打算作为一个动画平台,即使它可以以一种有限的完成。附录
d.惯例。
动画——这种图形交换格式并不打算成为一个动画平台,尽管它在某种程度上可以做到这一点。
我将用一个例子来分析gif的结构。想跟风就下载吧。(注2)
如果你在家学习,你只需要一台安装了hexdump工具的机器。我想用xxd,大部分unix系统(linux,macos)预装或者可以通过vimcommon包安装。
gif头
每个gif都以一个标题开始,其中的神奇位表明它是哪种gif,一点额外的信息提供了关于图像的基本细节。
xxd sunflow:4749 4638 3961dc00 0501 f 700 0002 0102 gif 89 a..........可以很容易地将gif头信息解码成ascii(如果有意义的话)。看上面写的gif89a!这是认证有效的gif!
每个字母是一个字节,所以我们在这里寻找的神奇字节是:0x47,;0x49、0x46、0x38、0x39、0x61 .
另外,后三个字节可能是:0x38、0x37、0x61,如果只支持gif87a文件格式,就会出现这种情况。我们主要学习gif89,但是老版本的格式已经过去了。
此外,gif头中没有什么有趣的东西,因为它只是静态文本,所以让 让我们继续前进。
等一下问个问题:谁会接受gif87a
在学习gif的时候,我想看看各大gif托管提供商是否会接受并保留gif87a规范的格式。能不能正常使用,还是只能用报告错误?
这就是我们之前看到的向日葵的gif87a版本。这个版本只在这里使用。
让 上传图片到四个gif主机提供商:
tenorgiphyimgurgfycat当我们开始的时候,gif头是这样的:
xxd向日葵_ as _ gif _ w: 4749 4638 3761 fa 00 2901 f 500 00 fff cc 33 gif 87 a...)...3以下是我刚上传的图片下载后的结果。
记录为gif89a的期限:
下载xxdt: 4749 4638 3961 a 401 f 201 f 700 0006 0406 gif 89 a..........giphy重新编码为gif89a:
下载xxdgiphy.gif |头100000000: 4749 4638 3961 fa00 2901 f525 00000000 gif 89 a...% ...事实上,它 有点欺骗性。giphy只接受动画gif,所以我们必须单击编辑按钮(显示帧编辑器),然后单击完成。gif87a规范允许存储多张图片,但不能延迟(所以没有动画,见注3)。
imgur保留了原始文件!!!
下载xxdaux m3nn.gif |头100000000: 4749 4638 3761 fa00 2901 f500 00ff cc33 gif 87 a...)3至于gfycat,一直卡在决赛 编码 登台20分钟。我希望我没有。;不要让他们可怜的工程师在周末看到任何警报。
上述简要分析表明,世界上最大的两家技术公司拥有的两个最大的主机提供商don 不尊重我的旧gif文件,而是完全重写。其实对于giphy来说,似乎只尊重一张gif。......
无论如何,让我们 让我们回到探索文件格式的主题。
逻辑屏幕描述符
那么你的图像在一定分辨率下是如何显示的呢?假设我们使用 获取信息和macos预览版中的f: 4749 4638 3961dc00 0501f700 0002 0102 gif 89 a..........在每个维度中有两个字节来指定大小。记住gif文件格式中的所有字节都被指定为小端字节也很重要(注5)。
第一个是宽度,即0x00dc(从dc00重新排序)= 220(十进制)。
然后是长度,即0x0105(从0501重新排序)= 261(十进制)。
等等,这是不是意味着我们的gif有分辨率限制?
那个 没错!因为每个位置只有两个字节,所以宽度和长度都不能大于65535。我们可以尝试在gimp中做一个1x65536的新gif来验证这一点。
其他文件格式在这方面是相似的。如果想下载理论上最宽的png,可以点这里。此文件很小,但当您打开它时,您的图像浏览器可能会崩溃。fir: 4749 4638 3961 dc00 0501f7 00 0002 0102 gif 89 a..........或者二进制:1111 0111。
这意味着我们的gif基本上是满的,除了gct没有排序。
┌┌┘┘┖┖┖┖└└┖┖┖┖└└└└└└┖┖┖┖┖└└└┖949它们是从0到255的标准rgb值,你可以在任何现代的rgb颜色选择器中使用这些值。
等一下。全局颜色表是可选吗?
您可能已经注意到,0xa字节的第一位表示gct可以是可选的。这真的很有意思。我们如何在不指定图像需要什么颜色的情况下渲染图像?
根据以下规格:
颜色表全局颜色表和局部颜色表都是可选的;如果有全局颜色表,它将被用于数据流中没有给出局部颜色表的所有图像;如果本地颜色表存在,它将覆盖全局颜色表。但是,如果两个颜色表都不存在,应用程序可以自由使用任何颜色表。
如果我们拿走图像的全局颜色表,现代渲染器会对我们的图像做什么?我 我相信会有令人惊奇的事情发生。
我们的图像指定了一个768字节的颜色表。它从0xa字节开始.....假设我们像这样清除0xa字节的最高有效位。
然后删除到第789个字节(不含)。
xxd向日葵_as_gif_89anogct.gif |头100000000: 4749 4638 3961 dc00 0501 007 f 8121 f904 gif 89 a.......!..现在第一行是这样结束的,仍然是完全有效的gif,看起来是这样的:
it 很简单!在写这篇文章的时候,它只显示了一个完美的黑色方块。我试过的每个渲染器都是这种情况。gimp,chrome,firefox,preview,gifiddle,哪个都一样。
总之,回到逻辑屏幕描述符。
继续讨论逻辑屏幕描述符
存在在描述全局颜色表的字节之后,是描述屏幕描述符的最后两个字节。
字节b是背景色,指全局颜色表的索引;字节c是像素的纵横比,描述像素的方形度。
xxd向日葵_as_gif_w: 4749 4638 3961 dc00 0501 f700 0002 0102 gif 89 a..........^ ^ | |背景色为索引为0的颜色| gct |像素纵横比为0 :0或主机像素纵横比。等一下,像素长宽比是多少?
像素不一定都是方形的!字节不总是8位,但我赢了 关于这个我不能说太多。
gif和其他一些最流行的现代图像格式支持非方形像素。
想知道现在最流行的gif渲染器在渲染非方形像素时兼容性如何?让 让我们在firefox和chrom测试,看看他们看起来怎么样:
以上是:jpg,png,gif。火狐、c id = 333377
甚至我能找到的最兼容的gif浏览器gifiddl。
回到全局颜色表
全局颜色表(gct)显然是gif中最无聊的部分。这里真的没什么值得谈的。
我的可怕的gif项目可以输出向日葵gct中的所有颜色(也许其他图像也可以)。
对gct的分析在这里,你可以看到它确实没有什么特别之处。
使用以下命令运行它:
货物o运行安静gif文件。/experiments/sunflower _ as _ gif _ web safe . gif可选图形控件扩展。
让 s说一下图形控制扩展(gce),由扩展引入的0x21引入,后面是0xf9(!)
有许多可用的扩展,但图形控件扩展是最重要的扩展之一,至少在现代用例中是这样。gce允许帧间显示延迟,这样gif就可以 动画 。gc: 88a: 0000 00000021 fe51 4669 6c 65 2073 6f 75.....!gif。qfil测试中使用一个更简单的gif,所以它 更容易看出发生了什么:
在下面的测试中,我修改了它并删除了gc: 4749 4638 3961 2000 3400法国法郎.4.......00000010: 0000 0021法国法郎0500 0002 002c 0000 0000...!.......,....00000020: 2000 3400 0002 788 c 8fa 9 cb0b 0fa 3 94: cc7b abc 1 1cea d075 5fc 8 8d 64 a69d 68 a5 .{.....u_..d..h.00000040: 4e 66 eba 5 702 c 3675 cddc a5bd e34e bfcb nf..p,6u.....n..00000050: 0131 ac: a70d 3564 bd1a b52: cd1c c9a 2 016 a 74db fc1e c7c 3 f36f 9d7b .....jt......o.{00000080: d7: 9608 b728 d748 f768 1789 f751 b950 0000 ...(.h.h...q.p..000000a0: 3b;将其保存在名为invalid.hex的文本文件中,然后执行:xxdr invalid.hex invalid.gif。
(更新的字节为:0x16,从0x4到0x03)
第一个是macos预览版:
预览是达标的!
让 接下来试试firefox:
firefox知道这是一个静态值,并忽略其结果。这并不完全符合标准,但可能是最明智的做法。
当删除块大小时,chrome变得有点疯狂。在这里,chrome绝对是最不合标准的。
返回图形控制扩展
在我们读取块大小之后,它是一个包装字段,描述如下。
pack
这两个特性是任何现代浏览器或gif浏览器都不支持的。
如果你想了解更多关于纯文本扩展的信息,你可以看看这里。
可选注释扩展
接下来是注释扩展,它实际上可以出现在块开始的任何地方。但是,它最常出现在gif的这一部分。
注释部分只允许包含7位ascii码,而且是供人阅读的。
由于注释部分只有ascii,所以可以直接发出字符串并在输出中找到注释。
strings sunflower _ as _ gif _ web safe _ 89a . gif | head7 | tail1q文件sourc: commons.wikim: sunflow: 0000 0000 0021 fe51 4669 6c 65 2073 6f 75.....!。sou00000320: 7263 653 a 2068 7474 7073 3a 2f 63 6f6d rc: : 6d6f 6: 7267 2f 77 696 b 692 f 4669 6c 65 3a 53 756 :sun00000350: 666 c6 f77 6572 5f 61 735 f 6769 665 f 7765 flow:...其余的图像数据。
之后就没什么好谈的了。这张图片跳过了大部分其他gif特性,比如局部颜色表和动画,所以这张gif剩下的大部分只是数据和终止符。
说实话,lzw压缩并不难学,但这篇文章不是讲这个话题的。如果你想学,马修·弗利金格在他的网站上有一篇很好的文章。
附加内容:真彩色gif
你知道gif可以是真彩色吗?这与 本地颜色表和。每个数据段都允许有自己的局部颜色表,所以如果你把一个gif分成足够多的段,就可以得到真彩色!
大多数gif不 有几个原因使我们不能这样做。
首先,这样生成的图像非常大。每个新的256色调色板将消耗额外的768字节。
第二,当前的渲染器不会渲染这样的图像正确地 。默认情况下,如果没有指定,浏览器通常将帧之间的延迟设置为0.1。
然而,一个真正兼容的gif渲染器将正确显示真彩色gif。所以,如果你有足够的空间、内存和额外的cpu,为什么不做一个真彩色的gif呢?
如果你想了解更多真彩色gif,维基百科上有整整一章。总之,谢谢你耐心看这里。gif规范中有更多的部分我还没有 t提到了。如果你有兴趣了解更多关于gif的知识,我建议你查看一下规范和我在文章顶部添加的链接。
注意,:///ata4/gifiddlgif89a.txt文章标签:
了解更多gif格式属于什么文件存储格式(gif格式图片是什么意思)?相关内容请关注本站点。