为GIF选择透明色的算法

时间:2014-08-26 20:44:24

标签: algorithm unique gif

我有一堆(最多255个)颜色(总共256 ^ 3个可能的值),出于压缩目的,我想要想出另一种颜色,而不是其中之一。

例如,我有一个很小的颜色表:[0,0,0][1,42,69] - 剩余的256 ^ 3-2颜色中的任何一种都可以 - 无论是{{1} 1}}或[0,0,7]

有人能为我提供一种简单有效的算法来寻找另一种颜色吗?

UPD:也欢迎不好的想法。

3 个答案:

答案 0 :(得分:2)

  1. 制作一个包含所有已知颜色的哈希表,并将颜色放入其中。
  2. 制作一个采用颜色的算法,并通过递增最低字节来产生“后继”,并在有进位时继续增加到更高阶的字节。
  3. [0,0,0]开始,并根据步骤1中的哈希表进行检查。
  4. 循环,直到找到第一个空白。
  5. 此算法的颜色数量是线性的。

答案 1 :(得分:2)

由于现在我们有两个答案,我想张贴自己的答案。

我们不希望现有颜色表中的任何颜色变得透明。这就是为什么我说,颜色表最长可以是 255 颜色 因此,至少有一个红色(或绿色或蓝色,无论如何)通道值未使用。所以我们不必使用256 ^ 3大型标志表 - 256(内存位或速度字节)就足够了。

答案 2 :(得分:1)

浏览图像,计算256个可能像素值中的每一个出现的次数。使用std::min_element(一种可能性)查找最小计数,并使用该颜色编号。如果你真的在谈论256种可能的颜色值,那就是它。

如果你真的有每像素24位,那么你可能想要使用稀疏表示计数,因为(对于任何合理大小的图片),其中许多将不可避免地为零(你需要大约16-百万像素图片甚至在理论上使用所有可能的颜色)。 OTOH,在现代计算机上,甚至使用密集表示计数所需的几十兆字节(左右)可能是值得的 - 它可能会使您的处理更快(没有哈希码来计算)并且仍然有足够的内存减少处理时间是值得的。