根据 gif 的颜色计数计算位深度

Calculate the bit depth from the colour count of a gif

我一直在阅读 gif 规范,试图了解颜色 table 调色板的大小是如何计算的。

来自维基百科上的例子here

byte#  hexadecimal  text or
(hex)               value       Meaning
0:     47 49 46
       38 39 61     GIF89a      Header
                                Logical Screen Descriptor
6:     03 00        3            - logical screen width in pixels
8:     05 00        5            - logical screen height in pixels
A:     F7                        - GCT follows for 256 colors with
                                   resolution 3 x 8 bits/primary

如果您查看第 10 个字节,您会看到十六进制 F7 表示十进制数 247

现在我通过阅读各种代码示例知道这是一个由以下内容组成的打包值:

0x80 | // 1   : global color table flag = 1 (gct used)
0x70 | // 2-4 : color resolution
0x00 | // 5   : gct sort flag = 0
7 |; // 6-8 : gct size
0 |// background color index
0 |// pixel aspect ratio - assume 1:1

我还确定大小 7 表示位深度减去 1。可用于确定颜色的数量。

2 ^ (0 + 1) = 4
2 ^ (1 + 1) = 4
2 ^ (2 + 1) = 8
2 ^ (3 + 1) = 16
2 ^ (5 + 1) = 64
2 ^ (6 + 1) = 128
2 ^ (7 + 1) = 256

http://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp http://www.devx.com/projectcool/Article/19997/0/page/7

我想知道的是如何使用 C# 根据颜色数计算位深度。

因为这是你想要快速完成的事情,我认为使用某种位移机制将是最好的方法。虽然我不是计算机科学家,所以我为这些事情而苦苦挣扎。

我有一种可怕的感觉,它真的很简单...

我认为您正在寻找对数。将结果四舍五入以计算所需的位深度。

    /// <summary>
    /// Returns how many bits are required to store the specified
    /// number of colors. Performs a Log2() on the value.
    /// </summary>
    /// <param name="colors"></param>
    /// <returns></returns>
    public static int GetBitsNeededForColorDepth(byte colors) {
        return (int)Math.Ceiling(Math.Log(colors, 2));
    }

https://github.com/imazen/resizer/blob/c4c586b58b2211ad0f48f7d8285e951ff6f262f9/Plugins/PrettyGifs/PrettyGifs.cs#L239-L241