Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 为GIF选择透明颜色的算法_Algorithm_Unique_Gif - Fatal编程技术网

Algorithm 为GIF选择透明颜色的算法

Algorithm 为GIF选择透明颜色的算法,algorithm,unique,gif,Algorithm,Unique,Gif,我有一堆(最多255种)颜色(总共256^3种可能的值),出于压缩目的,我想想出一些其他颜色,它们不在其中 例如,我有一个很小的颜色表:[0,0,0],[1,42,69]——剩下的256^3-2种颜色中的任何一种都可以——不管是[0,0,7]还是[6,6,6] 有人能给我一个简单有效的算法来找到另一种颜色吗 UPD:坏主意也受欢迎 制作一个所有已知颜色的哈希表,并将您的颜色放入其中 制作一个采用颜色的算法,并通过递增最低字节来生成其“后继字节”,并在有进位时继续递增到高阶字节 从[0,0,0]开

我有一堆(最多255种)颜色(总共256^3种可能的值),出于压缩目的,我想想出一些其他颜色,它们不在其中

例如,我有一个很小的颜色表:
[0,0,0]
[1,42,69]
——剩下的256^3-2种颜色中的任何一种都可以——不管是
[0,0,7]
还是
[6,6,6]

有人能给我一个简单有效的算法来找到另一种颜色吗

UPD:坏主意也受欢迎

  • 制作一个所有已知颜色的哈希表,并将您的颜色放入其中
  • 制作一个采用颜色的算法,并通过递增最低字节来生成其“后继字节”,并在有进位时继续递增到高阶字节
  • [0,0,0]
    开始,对照步骤1中的哈希表进行检查
  • 循环直到找到第一个间隙
  • 该算法在颜色数量上是线性的

  • 制作一个所有已知颜色的哈希表,并将您的颜色放入其中
  • 制作一个采用颜色的算法,并通过递增最低字节来生成其“后继字节”,并在有进位时继续递增到高阶字节
  • [0,0,0]
    开始,对照步骤1中的哈希表进行检查
  • 循环直到找到第一个间隙

  • 此算法在颜色数量上是线性的。

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


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

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


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

    现在我们有两个答案,我想发布我自己的

    我们不希望现有颜色表中的任何颜色变为透明。这就是为什么我说,颜色表的最大长度可以是255种颜色。

    因此,至少有一个红色(或绿色或蓝色,无论什么)通道值未使用。因此,我们不必使用256^3大的标志表——256(内存位或速度字节)就足够了。

    既然现在我们有两个答案,我想发布我自己的答案

    我们不希望现有颜色表中的任何颜色变为透明。这就是为什么我说,颜色表的最大长度可以是255种颜色。

    因此,至少有一个红色(或绿色或蓝色,无论什么)通道值未使用。因此,我们不必使用256^3大的标志表——256(内存位或速度字节)就足够了。

    这听起来像是一个测试,lol。生成随机颜色,直到得到一个不在表中的颜色为止?随机源没有问题,预期的重试次数非常少。@DurbnPoison,没有,我只是用Ruby创建了自己的库,在问自己的时候,已经有了很好的想法,但希望看到其他想法。@Davidisenstat,关于低碰撞概率的想法是正确的,但是RND函数的使用可能会很慢。但是可能有这样一个迭代函数可以伪随机地从[0,0,0]遍历所有256^3。或者甚至不通过所有256^3,但在循环之前至少通过256。对smth simple found很好,比如[R,G,B]+=[+1,-1,0]这听起来像一个测试,哈哈。生成随机颜色,直到你得到一个不在表中的颜色?随机源没有问题,预期的重试次数非常少。@DurbnPoison,没有,我只是用Ruby创建了自己的库,在问自己的时候,已经有了很好的想法,但希望看到其他想法。@Davidisenstat,关于低碰撞概率的想法是正确的,但是RND函数的使用可能会很慢。但是可能有这样一个迭代函数可以伪随机地从[0,0,0]遍历所有256^3。或者甚至不通过所有256^3,但在循环之前至少通过256。对smth simple可以像[R,G,B]+=[+1,-1,0]一样很好。类似于“base 256”,当达到蓝色的最大值时,它将绿色滚动到1,并将蓝色重置为0。等等迟早你会找到一个不用的。最坏的情况下,你得数到1670万。这应该没那么难。@durbnpoisin不,你最多只能数256,因为第256个数字不会出现在你的哈希表中。对。这是最高数量的颜色进行比较。但如果你真的继续计算,最终结果是256256,你就错了