我无法弄清楚gif89a spec https://www.w3.org/Graphics/GIF/spec-gif89a.txt(第9-10页)中“颜色分辨率”字段与“全局颜色表的大小”字段之间的区别:
颜色分辨率-每个原色的位数[...]减1.。此值表示整个调色板的尺寸[...]
全局颜色表的大小-[...]要确定颜色表的实际大小,请将2增大为[字段的值+ 1]。
...
[全局颜色表]是代表红绿蓝三色组的字节序列,并且包含等于3 x 2 ^(全局颜色表的大小+1)的字节数。 / p>
假设我们要创建一个具有红色,绿色和蓝色三种颜色的图像。在这种情况下,每种颜色至少需要ceil(log2(3))= 2位(00 =红色,01 =绿色,10 =蓝色)。然后,根据规格,必须将“颜色分辨率(CR)”字段设置为ceil(log2(3))-1 = 2-1 = 1:
packed fields = X001XXXX
---
CR field
通常,如果N是颜色数,则CR = ceil(log2(N))-1。
关于全局颜色表(GCT)的大小,一种颜色需要3个RGB字节,因此条目数=字节数/ 3 = 2 ^(GCT的大小+ 1)。因为我们要存储3种颜色,所以我会选择3之后紧随其后的2的幂,即将2提升为ceil(log2(3))= 2 ^ 2 =4。然后,2 ^(GCT的大小+ 1)= 2 ^ ceil(log2(3)),GCT的大小+ 1 = ceil(log2(3))和GCT的大小= ceil(log2(3))-1 = 2-1 = 1:
packed fields = XXXXX001
---
Size of GCT field
同样,如果N是颜色数,则GCT的大小= ceil(log2(N))-1。
如您所见,CR = GCT的大小= ceil(log2(N))-1。似乎CR字段和GCT的大小字段始终保持相同的值。我想我错了,因为如果我是对的,那么这两个字段之一将毫无用处,但到目前为止,我在规范中未找到任何澄清。
我并不孤单:http://giflib.sourceforge.net/whatsinagif/bits_and_bytes.html。本文将“ GCT的大小”字段的定义应用于CR字段,而根本没有定义“ GCT的大小”字段:
[...]颜色分辨率[...]允许您计算[GCT]的大小。如果此字段的值为N,则全局颜色表中的条目数将为2 ^(N + 1)[...]。因此,样本图像中的001代表2位/像素; 111将代表8位/像素。
有人知道这两个字段不同的情况吗?
答案 0 :(得分:3)
根据规格:
iv) Color Resolution - Number of bits per primary color available
to the original image, minus 1. This value represents the size of
the entire palette from which the colors in the graphic were
selected, not the number of colors actually used in the graphic.
For example, if the value in this field is 3, then the palette of
the original image had 4 bits per primary color available to create
the image. This value should be set to indicate the richness of
the original palette, even if not every color from the whole
palette is available on the source machine.
很明显,颜色分辨率应该是制作GIF的原始图像中每种颜色的位数(小于1)。