Python中的颜色处理
Posted
技术标签:
【中文标题】Python中的颜色处理【英文标题】:Color handling in Python 【发布时间】:2011-04-12 15:41:53 【问题描述】:对于我的集群 gui,我目前正在为集群使用随机颜色,因为我事先不知道最终会得到多少个集群。
在 Python 中,这看起来像:
import random
def randomColor():
return (random.random(),random.random(),random.random())
但是,当我更新内容时,颜色会发生变化。
所以我更喜欢有一个函数,它有一个输入参数,比如
def nonrandomColor(i):
...
return color
总是会为相同的 I 返回相同的颜色,同时保持生成任意多种颜色的能力。
答案不必用 Python 制定,它更像是我感兴趣的一般布局。
【问题讨论】:
显然您想要的是小便池协议blog.xkcd.com/2009/09/02/urinal-protocol-vulnerability 的三维概括,最好是在 HSL 空间中,这样您就可以限制饱和度和亮度,以保证相当大的对比度。 ...或者也许我想多了。 本着过度思考的精神,将sub-random sequences 用于颜色应该提供一些对比。 【参考方案1】:一种方法是使用缓存。使用defaultdict
:
>>> import random
>>> def randomColor():
... return (random.random(),random.random(),random.random())
...
>>> from collections import defaultdict
>>> colors = defaultdict(randomColor)
>>> colors[3]
(0.10726172906719755, 0.97327604757295705, 0.58935794305308264)
>>> colors[1]
(0.48991106537516382, 0.77039712435566876, 0.73707003166893892)
>>> colors[3]
(0.10726172906719755, 0.97327604757295705, 0.58935794305308264)
【讨论】:
将 dict 的前几个条目预先设置为易于区分的颜色(红色、黄色、绿色、蓝色)将减少生成带有蓝色、蓝色、蓝色和蓝色线条的图形的机会. @Jason:你的想法很有用。颜色为各种深浅不一的蓝色的风险并不高,但将前几种颜色设为静态也可以使图表更易于理解。【参考方案2】:只需将随机生成器的seed 设置为索引,这可能比存储颜色便宜。
random.seed(i)
请注意,这会使随机数方式比以前更不随机。如果这是一个问题,例如如果您的应用程序在其他地方使用随机数,您可能需要查看其他答案建议的缓存选项。
【讨论】:
-1 因为频繁设置随机种子会导致随机数生成器高度非随机。如果您的程序还使用随机数来做其他事情,这将是一个坏主意。 避免弄乱随机数生成器的一种方法是使用专门的颜色生成器。color_rnd = random.Random(); color_rnd.seed(i)
【参考方案3】:
如果你想要可重复的非碰撞颜色,那么你可以使用类似下面的函数。它将数字分成 1、10、100,然后将它们用作颜色的 RGB 部分。
def color(i):
r = i % 10
g = (i//10) % 10
b = (i//100) % 10
return(r*25, g*25, b*25)
例如:
color(1) == (25,0,0)
color(10) == (0,25,0)
color(999) = (225,225,255)
【讨论】:
【参考方案4】:您想将颜色存储在字典或列表中:
colors = # int -> color
def nonrandomColor(i):
if i not in colors:
colors[i] = randomColor()
return colors[i]
【讨论】:
【参考方案5】:您可以使用i
为随机数生成器播种。因此,只要种子保持不变,您就会得到相同的值。
>>> import random
>>> random.seed(12)
>>> random.randint(0,255), random.randint(0,255), random.randint(0,255)
(121, 168, 170)
>>> random.seed(12)
>>> random.randint(0,255), random.randint(0,255), random.randint(0,255)
(121, 168, 170)
>>> random.seed(10)
>>> random.randint(0,255), random.randint(0,255), random.randint(0,255)
(146, 109, 147)
>>> random.seed(10)
>>> random.randint(0,255), random.randint(0,255), random.randint(0,255)
(146, 109, 147)
根据您可能生成的颜色数量(即 10 种或 100 万种),缓存方法可能比 seed()
方法更好。
【讨论】:
尽可能不要乱用全局种子!创建您自己的random.Random
对象并设置其种子。以上是关于Python中的颜色处理的主要内容,如果未能解决你的问题,请参考以下文章