【问题标题】:Generating a Random Hex Color in Python在 Python 中生成随机十六进制颜色
【发布时间】:2012-12-09 13:13:23
【问题描述】:

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

【问题讨论】:

    标签: python django


    【解决方案1】:
    import random
    r = lambda: random.randint(0,255)
    print('#%02X%02X%02X' % (r(),r(),r()))
    

    【讨论】:

    • 可能应该使用%02X 而不是%2X 以便在需要时填充前导0。否则页面会假发,因为您最终可能会得到像 # E1465 这样的值,其中包含一个空格。
    • 偏执狂: print ('#%06X' % random.randint(256**3-1))
    • 您在 cmets 中缺少替代建议的参数,从而阻止它运行。 print ('#%06X' % random.randint(0,256**3-1)) 虽然有效。
    • 作为变量:color = '#{:02x}{:02x}{:02x}'.format(r(), r(), r())
    • 为 RGBA 添加一个额外的%02X
    【解决方案2】:

    这是一个简单的方法:

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

    生成随机的 3 字符颜色:

    import random
    color = "%03x" % random.randint(0, 0xFFF)
    

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

    如果需要,颜色可以用“#”作为前缀(CSS 样式)

    【讨论】:

      【解决方案3】:

      将其存储为 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'
      

      【讨论】:

      • 这是怎么随机的?
      【解决方案4】:

      晚会有点晚了,

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

      【讨论】:

        【解决方案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'
        

        【讨论】:

        • 与使用简单的单行代码如 f"#{random.randint(0, 0xFFFFFF)}"相比,错误使用 3rd 方库更容易引入错误
        【解决方案6】:

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

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

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

        【讨论】:

        • 一些示例输出将有助于更好地遵循这一点。
        【解决方案7】:
        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()
        

        【讨论】:

        • 在函数调用中美观、可读和可重复,谢谢
        【解决方案8】:

        有很多方法可以做到这一点,所以这里有一个使用“colorutils”的演示。

        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()
        

        我当然希望这会有所帮助。

        【讨论】:

          【解决方案9】:

          要生成随机的任何东西,请查看random module

          我建议你使用该模块生成一个随机整数,取模2**24,并将前 8 位视为 R,将中间 8 位视为 G,将后 8 位视为 B。
          这一切都可以通过 div/mod 或按位操作来完成。

          【讨论】:

            【解决方案10】:
            import random
            
            def generate_color():
                color = '#{:02x}{:02x}{:02x}'.format(*map(lambda x: random.randint(0, 255), range(3)))
                return color
            

            【讨论】:

              【解决方案11】:

              基本上,这会给你一个标签、一个转换为十六进制的随机数和一个零填充。

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

              【讨论】:

                【解决方案12】:
                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
                

                【讨论】:

                • hex_digits 是不必要的:它是string 模块的一部分:string.hexdigits。 (请注意,大写和小写都会出现,因此您可能需要使用string.hexdigits[:16]。)
                【解决方案13】:
                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:]
                

                【讨论】:

                • 仅供参考:这个问题已有多年历史,提供的答案被标记为低质量帖子以供审查。以下是How do I write a good answer? 的一些指南。提供的这个答案可能是正确的,但它可以从解释中受益。还有其他答案提供了 OP 的问题,它们是前一段时间发布的。发布答案时,请确保添加新的解决方案或更好的解释,尤其是在回答较旧的问题时。
                【解决方案14】:

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

                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:]
                

                我的建议是:

                import numpy as np 
                
                def color_generator (no_colors):
                    colors = []
                    while len(colors) < no_colors:
                        random_number = np.random.randint(0,16777215)
                        hex_number = format(random_number, 'x')
                        if len(hex_number) == 6: 
                            hex_number = '#'+ hex_number
                            colors.append (hex_number)
                    return colors
                

                【讨论】:

                  【解决方案15】:

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

                  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
                      return random_col
                  

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

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

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

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

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

                  干杯!

                  【讨论】:

                    【解决方案16】:
                    import secrets
                    rgba = '#'+secrets.token_hex(3)
                    

                    【讨论】:

                    • rgba = '#'+secrets.token_hex(4)
                    【解决方案17】:

                    嗨,也许我可以帮助生成随机十六进制颜色的下一个函数:

                    from colour import Color
                    import random as random
                    def Hex_color():
                        L = '0123456789ABCDEF'
                        return Color('#'+ ''.join([random.choice(L) for i in range(6)][:]))
                    

                    【讨论】:

                      猜你喜欢
                      • 2015-10-07
                      • 2016-02-04
                      • 2011-12-29
                      • 2017-06-15
                      • 1970-01-01
                      • 2018-08-26
                      • 2014-07-03
                      相关资源
                      最近更新 更多