【问题标题】:Returning Gradient Strings in Python在 Python 中返回渐变字符串
【发布时间】:2015-04-17 19:36:00
【问题描述】:

所以这就是我想要做的......

假设我使用“彩虹”效果,它将使用字体标签生成字符串并赋予它“彩虹”效果。但是彩虹渐变效果会延伸到文本的长度,并且不会重复任何颜色。

这就是我的意思:

字符串 'Rainbow' 会产生以下代码:

<font color="#ff0000">R</font><font color="#ff7f00">a</font><font color="#ffff00">i</font><font color="#00ff00">n</font><font color="#00ffff">b</font><font color="#0000ff">o</font><font color="#8b00ff">w</font>

看看彩虹的所有 7 种颜色如何适合文本的所有 7 个字母?现在让我们说文本更长。我的意思是,更长的时间。

字符串 'Rainboooooooooooooooooooow' 需要适合其中的所有渐变,同时以“#ff0000”标签开始并以“#8b00ff”标签结束,而不重复任何相同的颜色。这意味着我需要以某种方式在两者之间“生成”字体颜色。所以这个字符串会产生类似的结果:

<font color="#ff0000">R</font><font color="#ff2000">a</font><font color="#ff4000">i</font><font color="#ff5f00">n</font><font color="#ff7f00">b</font><font color="#ff9f00">o</font><font color="#ffbf00">o</font><font color="#ffdf00">o</font><font color="#ffff00">o</font><font color="#bfff00">o</font><font color="#80ff00">o</font><font color="#40ff00">o</font><font color="#00ff00">o</font><font color="#00ff55">o</font><font color="#00ffaa">o</font><font color="#00ffff">o</font><font color="#00bfff">o</font><font color="#0080ff">o</font><font color="#0040ff">o</font><font color="#0000ff">o</font><font color="#2300ff">o</font><font color="#4600ff">o</font><font color="#6800ff">o</font><font color="#8b00ff">w</font>

如何在 python 中做到这一点?我一直在试图弄清楚,但我就是无法...帮助将不胜感激。

【问题讨论】:

    标签: python python-3.x fonts colors


    【解决方案1】:

    有趣的问题!我认为一个简单的方法是使用hue, saturation and luminance (or lightness) (HSL) color model。使用这个颜色模型,我们可以通过改变色调并保持饱和度和亮度恒定来获得彩虹的所有颜色。

    为了在 Python 中实现这一点,我们可以使用 colour 模块。使用它,我创建了一个函数来制作彩虹色列表,然后是第二个函数,将这些 Color 对象转换为它们的十六进制表示:

    def get_rainbow_colors(length):
        """ Makes a list of rainbow Colors. """
        return [
            Color(hue=i/(length - 1), saturation=1, luminance=0.5)
            for i in range(length)]
    
    def convert_to_hex_colors(colors):
        """ Convert a list of Color objects to hexadecimal colors. """
        return [color.get_hex_l() for color in colors]
    

    注意:如果您不想环绕颜色,请将get_rainbow_colors 中的(length - 1) 更改为length,即第一个颜色始终为红色,length - 1 最后一个颜色也是红色,但只有length 最后一个颜色是蓝色/紫色。

    最后我做了一个函数,将单词转换为 HTML 文本,其中每个字符都有不同的颜色。

    def convert_to_rainbow_html_string(word):
        """ Returns a HTML text where the colors of the characters make a rainbow. """
        rainbow_colors = get_rainbow_colors(len(word))
        rainbow_colors = convert_to_hex_colors(rainbow_colors)
        html_str = ''
        for color, character in zip(rainbow_colors, word):
            html_str += '<font color="' + color + '">' + character + '</font>'
    
        return html_str
    

    这个函数给出了彩虹这个词的以下输出:&lt;font color="#ff0000"&gt;r&lt;/font&gt;&lt;font color="#ffff00"&gt;a&lt;/font&gt;&lt;font color="#00ff00"&gt;i&lt;/font&gt;&lt;font color="#00ffff"&gt;n&lt;/font&gt;&lt;font color="#0000ff"&gt;b&lt;/font&gt;&lt;font color="#ff00ff"&gt;o&lt;/font&gt;&lt;font color="#ff0000"&gt;w&lt;/font&gt;

    matplotlib 示例

    完整代码

    from colour import Color
    import matplotlib.pyplot as plt
    
    
    def get_rainbow_colors(length):
        """ Makes a list of rainbow Colors. """
        return [
            Color(hue=i/(length - 1), saturation=1, luminance=0.5)
            for i in range(length)]
    
    
    def convert_to_hex_colors(colors):
        """ Convert a list of Color objects to hexadecimal colors. """
        return [color.get_hex_l() for color in colors]
    
    
    def convert_to_rainbow_html_string(word):
        """ Returns a HTML text where the colors of the characters make a rainbow. """
        rainbow_colors = get_rainbow_colors(len(word))
        rainbow_colors = convert_to_hex_colors(rainbow_colors)
        html_str = ''
        for color, character in zip(rainbow_colors, word):
            html_str += '<font color="' + color + '">' + character + '</font>'
    
        return html_str
    
    
    print(convert_to_rainbow_html_string('rainbow'))
    
    # Example with matplotlib
    words = ["Text", "Longertext", "veryveryverylongtext"]
    for y, word in enumerate(words):
        rainbow_colors = get_rainbow_colors(len(word))
        rainbow_colors = convert_to_hex_colors(rainbow_colors)
    
        # Plot characters of a word in rainbow colors
        for i, color in enumerate(rainbow_colors):
            plt.text(i/len(rainbow_colors), 0.1 - y/10, word[i], color=color, size=18)
            plt.xlim([-0.1, 1.1])
            plt.ylim([-0.2, 0.2])
    
    plt.axis('off')
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 2021-08-23
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 2018-05-25
      • 2013-11-05
      相关资源
      最近更新 更多