What's In A GIF - Bit by Byte

原文:http://matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp

 

       我们将开始漫步GIF文件的不同部分。 (此页上的信息主要是来自W3C的GIF89a规范)。GIF文件是由一堆不同的“块”数据构成。下图显示了所有不同类型的块以及它们在文件中的位置。文件从左边开始按照它的方式向右。在每一个分支,你可以通过一种或其他方式。比较大的中间部分在需要时可以重复出现多次。(从技术上讲,它也可能被完全忽略,但我不能想象一个没有图像数据的GIF文件能有什么好的。)

        我会通过一个GIF样本文件告诉你这些块的样子。你可以看示例文件和其下面对应的字节。

        注意:并非所有的块都被显示在示例文件中。我提供的示例文件在适当的地方忽略了部分块。这些不同的块包括:header, logical screendescriptor(逻辑屏幕描述符), global color table(全局颜色表), graphics controlextension(图形控制扩展), image descriptor(图像描述符), local color table(本地颜色表), image data(图像数据), plain text extension(纯文本扩展), application extension(应用扩展), comment extension(注释扩展), and trailer(预览)。让我们从第一个块开始!

 

Header Block(报头)

        样本文件的:47 49 46 38 39 61 。

        所有GIF文件必须从报头开始。报头占用文件的前六个字节。这些字节都应该符合ASCII字符编码。实际上,这里面有两条信息。前三个字节被称为签名。这几个字符应该是“GIF”(即47=“G”,49=“I”,46=“F”)。接下来的三个字节指定我们对图像进行编码所使用的规范的版本。我们将只使用“89a”(即38=“8”,39=“9”,61=“A”)。另外一个公认版本号是“87a”,但我怀疑大多数人还会再遇到那些(The only other recognizedversion string is "87a" but i doubt most people will run into thoseanymore.)。

Logical Screen Descriptor

        示例文件的:0A 00 0A 00 91 00 00

        逻辑屏幕描述符总是紧跟报头。该块告诉解码器一个图像要占用多少空间。这是整整7个字节长。从画布的宽度开始。这个值是前两个字节。它保存在一个所谓的规范简单地调用无符号格式(It's saved in a formatcalled the spec simply calls unsigned)。基本上我们正在寻找一个16位的非负整数(0 – 65535)。与所有其他的GIF格式的多字节值,最低有效字节会被优先存储(little-endian格式)。这意味着我们从字节流中读取到0A 00的地方,我们通常会写作00 0A等同于10。因此,我们的样本图像宽度为10像素。更进一步例如255会存储为FF 00,但是256将会是00 01。正如你所期望的,画布的高度也用这种方式。同样,在示例文件中,高度值是0A 00即10像素。

        接着是一个压缩字节(a packed byte)。这意味着,该字节在它的bit位上存储了多个值。在这种情况下,字节91可表示为二进制数10010001.(内置在windows的计算机实际上在转换十六进制和二进制的数字时非常有用。务必确定你的windows版本里有“科学”和“程序员”模式。)第一个(最高有效)bit是全局颜色表标志。0表示没有,1表示颜色表会在后边。在样本文件中,我们可以看到有全局颜色表(将会是通常情况。)接下来的3bits代表颜色分辨率。规范描述这个值“是每一原始图像用到的主要颜色的bit值减一”和“…代表图像颜色的整个调色板的大小”。由于我并不讨论这个做什么,我会告诉你一个讲解位和颜色深度更详细的文章。现在1个已讲完,注意001代表2bits/pixel,111表示82bits/pixel。下一个bit是排序标志。值为1,则全局颜色表中的颜色会按照重要性降序排列,通常意味着在图像中“降低频率”(If the values is 1, thenthe colors in the global color table are sorted in order of "decreasingimportance," which typically means "decreasing frequency" in theimage.)这对解码器有益但不是必须的。示例中我们会使用0。最后3 bits是全局颜色表的大小。Well,that’s a lie;这并不是表的实际大小。如果这个值是N,则表的实际大小是2^(N+1)。样本文件中,我们的这三个bit是1的二进制表示001。实际的表大小是2^(1+1)=4。(我们已经提到过几次表示全局颜色表的字节,我们将在下一节中谈论它是什么。)

        下一字节是背景颜色索引。这个字节是唯一有意义的,如果全局颜色表标志为1。它表示全局颜色表中的颜色(通过指定其索引)应该作为像素使用而不是在图像数据中指定的值。存在一些情况,如果没有全局颜色表,这个字节应该是0。

        逻辑屏幕描述符的最后一个字节是像素长宽比。我并不确定这个值是干什么的。我见过的大多数图像的这个值是0。规范这样描述该值,如果指定这个值为N,N<>0,使用的实际比例将是(N+15)/64。 





未完。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值