link facebook2 twitter youtube

pythonである範囲の色で絞り込み

RGB色で行ってみる

他の表色系に変換した方が良さげな記事はあったのですが、一旦RGBからのみでプログラムを書きました。以下コードです。
Googleで検索をかけると標準モジュールで用意されているのでこれを使用します。
https://docs.python.jp/3/library/colorsys.html


import colorsys


class Color:

    @staticmethod
    def rgb_to_hsv(r, g ,b):
        return colorsys.rgb_to_hsv(r, g, b)

    @staticmethod
    def decimal_to_hex(r, g, b):

        _ = lambda x: hex(x).replace("0x", "").zfill(2)

        return _(r) + _(g) + _(b)

    @staticmethod
    def hsv_to_rgb(h, s, v):
        result = [0,0,0]
        color = colorsys.rgb_to_hsv(h, s, v)

        result[0] = int(color[0])
        result[1] = int(color[1])
        result[2] = int(color[2])

        if result[0] < 0:
            result[0] = 0

        if result[0] > 255:
            result[0] = 255

        if result[1] < 0:
            result[1] = 0

        if result[1] > 255:
            result[1] = 255

        if result[2] < 0:
            result[2] = 0

        if result[2] > 255:
            result[2] = 255

        return result

    @staticmethod
    def hex(val):
        return (int(val[1:3], 16), int(val[3:5], 16), int(val[5:7], 16))

    @classmethod
    def peripheral(cls, color_hex, coefficient=100):

        result = []
        color = cls.hex(color_hex)

        base = coefficient

        def min(val):
            if val < 0:
                return 0
            return val

        def max(val):
            if val > 255:
                return 255
            return val

        min_red = min(int(color[0]-base))
        min_green = min(int(color[1]-base))
        min_blue = min(int(color[2]-base))

        max_red = max(int(color[0]+abs(base)))
        max_green = max(int(color[1]+abs(base)))
        max_blue = max(int(color[2]+abs(base)))

        return {
            'min': [min_red, min_green, min_blue],
            'max': [max_red, max_green, max_blue]
        }


_color = '#447788'
ret = Color.peripheral(_color)
min = '#' + Color.decimal_to_hex(ret['min'][0], ret['min'][1], ret['min'][2])
max = '#' + Color.decimal_to_hex(ret['max'][0], ret['max'][1], ret['max'][2])

#結果をhtmlに取得
print(ret, min, max)
print("<style>.box {background: linear-gradient(" + min + ", " + max + "); height:80%} .box2 {background-color: " + _color +
      "; height:20%}</style> <div class='box'></div><div class='box2'></div>")

This Post Was Written By 若井豊

© eggplant