在Python中生成随机十六进制颜色

时间:2012-12-22 00:25:45

标签: python django

对于Django应用程序,每个“成员”都会分配一种颜色来帮助识别它们。它们的颜色存储在数据库中,然后在需要时打印/复制到HTML中。唯一的问题是我不确定如何在python / django中生成随机Hex颜色。生成RGB颜色很容易,但是为了存储它们,我要么需要a)在我的“Member”模型中创建三个额外的列,或者b)将它们全部存储在同一列中并使用逗号将它们分开,然后,解析HTML的颜色。这些都不是很吸引人,所以,我再次想知道如何在python / django中生成随机Hex颜色。

16 个答案:

答案 0 :(得分:102)

import random
r = lambda: random.randint(0,255)
print('#%02X%02X%02X' % (r(),r(),r()))

答案 1 :(得分:32)

这是一个简单的方法:

import random
color = "%06x" % random.randint(0, 0xFFFFFF)

生成随机3字符颜色:

import random
color = "%03x" % random.randint(0, 0xFFF)
基于C语言的

%x是一个字符串格式化程序,用于将整数格式化为十六进制字符串,而0x是在base-16中写入数字的前缀。

如果需要,颜色可以带有“#”前缀(CSS样式)

答案 2 :(得分:9)

将其存储为HTML颜色值:

更新:现在接受整数(0-255)和浮点数(0.0-1.0)。这些将被限制在允许的范围内。

def htmlcolor(r, g, b):
    def _chkarg(a):
        if isinstance(a, int): # clamp to range 0--255
            if a < 0:
                a = 0
            elif a > 255:
                a = 255
        elif isinstance(a, float): # clamp to range 0.0--1.0 and convert to integer 0--255
            if a < 0.0:
                a = 0
            elif a > 1.0:
                a = 255
            else:
                a = int(round(a*255))
        else:
            raise ValueError('Arguments must be integers or floats.')
        return a
    r = _chkarg(r)
    g = _chkarg(g)
    b = _chkarg(b)
    return '#{:02x}{:02x}{:02x}'.format(r,g,b)

结果:

In [14]: htmlcolor(250,0,0)
Out[14]: '#fa0000'

In [15]: htmlcolor(127,14,54)
Out[15]: '#7f0e36'

In [16]: htmlcolor(0.1, 1.0, 0.9)
Out[16]: '#19ffe5'

答案 3 :(得分:5)

之前已经完成了。您可能希望使用现成的库,例如Faker,而不是自己实现,可能会引入错误。请查看color providers,特别是hex_digit

In [1]: from faker import Factory

In [2]: fake = Factory.create()

In [3]: fake.hex_color()
Out[3]: u'#3cae6a'

In [4]: fake.hex_color()
Out[4]: u'#5a9e28'

答案 4 :(得分:4)

只需将它们存储为一个整数,三个通道位于不同的位偏移处(就像它们通常存储在内存中一样):

value = (red << 16) + (green << 8) + blue

(如果每个频道为0-255)。将该整数存储在数据库中,并在需要返回不同的通道时执行相反的操作。

答案 5 :(得分:4)

晚会很晚,

import random
chars = '0123456789ABCDEF'
['#'+''.join(sample(chars,6)) for i in range(N)]

答案 6 :(得分:3)

import random

def hex_code_colors():
    a = hex(random.randrange(0,256))
    b = hex(random.randrange(0,256))
    c = hex(random.randrange(0,256))
    a = a[2:]
    b = b[2:]
    c = c[2:]
    if len(a)<2:
        a = "0" + a
    if len(b)<2:
        b = "0" + b
    if len(c)<2:
        c = "0" + c
    z = a + b + c
    return "#" + z.upper()

答案 7 :(得分:3)

有很多方法可以做到这一点,所以这是一个使用&#34; colorutils&#34;的演示。

  

pip install colorutils

可以在(RGB,HEX,WEB,YIQ,HSV)中生成随机值。

# docs and downloads at 
# https://pypi.python.org/pypi/colorutils/

from colorutils import random_web
from tkinter import Tk, Button

mgui = Tk()
mgui.geometry('150x28+400+200')


def rcolor():
    rn = random_web()
    print(rn)  # for terminal watchers
    cbutton.config(text=rn)
    mgui.config(bg=rn)


cbutton = Button(text="Click", command=rcolor)
cbutton.pack()

mgui.mainloop()

我当然希望这有用。

答案 8 :(得分:2)

要随机生成任何内容,请查看random module

我建议你使用模块生成一个随机整数,取其模2**24,并将前8位视为R,将中8位视为G,将下8视为B. 它可以通过div / mod或按位运算来完成。

答案 9 :(得分:2)

基本上,这会给你一个#标签,一个转换为十六进制的randint,以及一个零填充。

from random import randint
color = '#{:06x}'.format(randint(0, 256**3))
#Use the colors wherever you need!

答案 10 :(得分:1)

hex_digits = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']

digit_array = []

for i in xrange(6):
    digit_array.append(hex_digits[randint(0,15)])
joined_digits = ''.join(digit_array)

color = '#' + joined_digits

答案 11 :(得分:0)

import random

def generate_color():
    color = '#{:02x}{:02x}{:02x}'.format(*map(lambda x: random.randint(0, 255), range(3)))
    return color

答案 12 :(得分:0)

import random

def get_random_hex:
    random_number = random.randint(0,16777215)

    # convert to hexadecimal
    hex_number = str(hex(random_number))

    # remove 0x and prepend '#'
    return'#'+ hex_number[2:]

答案 13 :(得分:0)

由于我发现它可以生成少于6个字符的颜色代码,因此希望对此解决方案进行改进。我还想生成一个函数,该函数将创建一个列表,该列表可用于其他地方,例如在matplotlib中进行集群。

SELECT * FROM table1 ORDER BY (CASE WHEN INTime IS NULL THEN OutTime ELSE INTime END) ASC

我的建议是:

import random

def get_random_hex:
    random_number = random.randint(0,16777215)

    # convert to hexadecimal
    hex_number = str(hex(random_number))

    # remove 0x and prepend '#'
    return'#'+ hex_number[2:]

答案 14 :(得分:0)

这是我根据十六进制颜色表示法表示的简单代码:

import random 

def getRandomCol():

    r = hex(random.randrange(0, 255))[2:]
    g = hex(random.randrange(0, 255))[2:]
    b = hex(random.randrange(0, 255))[2:]

    random_col = '#'+r+g+b`enter code here`

    return random_col

十六进制颜色代码中的“#”仅表示所表示的数字仅为十六进制数字。重要的是接下来的6位数字。这6个十六进制数字中的2位数字对分别代表RGB的强度(红色,绿色和蓝色)。每种颜色的强度范围在0-255之间,RGB不同强度的组合产生不同的颜色。

例如,在#ff00ff中,第一个ff等于十进制255,下一个00等于十进制0,最后一个ff等于255以十进制表示。因此,十六进制颜色编码中的#ff00ff等效于RGB(255, 0, 255)

有了这个概念,这就是我的方法的解释:

  1. rg中的每一个生成的随机数强度 和b
  2. 将这些强度转换为十六进制
  3. 忽略每个十六进制值'0x'的前2个字符
  4. '#'与十六进制值rgb连接起来 强度。

如果您想进一步了解颜色的工作原理,请随时参考此链接:https://hackernoon.com/hex-colors-how-do-they-work-d8cb935ac0f

干杯!

答案 15 :(得分:0)

SQL> select
  2    replace(
  3      replace(
  4        replace('ABC|||CDE|||||DEF|||||||556||||.|.|',      --> input string
  5                '|',
  6                '|' || chr(9)
  7               ),
  8              chr(9) || '|'
  9             ),
 10             chr(9), '') result
 11  from dual;

RESULT
--------------------
ABC|CDE|DEF|556|.|.|

SQL>