Algorithm 为GIF选择透明颜色的算法
我有一堆(最多255种)颜色(总共256^3种可能的值),出于压缩目的,我想想出一些其他颜色,它们不在其中 例如,我有一个很小的颜色表: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]开
[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,你就错了