Сообщить об ошибке.

Модуль colorsys в Python, преобразования цвета

Преобразования между цветовыми пространствами/системами

Модуль colorsys определяет двунаправленное преобразование цветовых значений между цветовыми системами, выраженными в цветовом пространстве RGB (красный, зеленый, синий), используемом в компьютерных мониторах, и в трех других системах координат: YIQ, HLS (оттенок, яркость, насыщенность) и HSV (оттенок, насыщенность).

Содержание:


Координаты во всех этих цветовых пространствах являются значениями float. В пространстве YIQ координата Y находится в диапазоне от 0 до 1, но координаты I и Q могут быть положительными или отрицательными. Во всех других пространствах координаты находятся в диапазоне от 0 до 1.

Модуль colorsys определяет следующие функции.

  • colorsys.rgb_to_yiq(r, g, b) - преобразует цвет из координат RGB в координаты YIQ.
  • colorsys.yiq_to_rgb(y, i, q) - преобразует цвет из координат YIQ в координаты RGB.
  • colorsys.rgb_to_hls(r, g, b) - преобразует цвета из координат RGB в координаты HLS.
  • colorsys.hls_to_rgb(h, l, s) - преобразует цвета из координат HLS в координаты RGB.
  • colorsys.rgb_to_hsv(r, g, b) - преобразует цвет из координат RGB в координаты HSV.
  • colorsys.hsv_to_rgb(h, s, v) - преобразует цвет из координат HSV в координаты RGB.

Примеры преобразований при помощи модуля colorsys:

>>> import colorsys
>>> colorsys.rgb_to_hsv(0.2, 0.4, 0.4)
# (0.5, 0.5, 0.4)
>>> colorsys.hsv_to_rgb(0.5, 0.5, 0.4)
# (0.2, 0.4, 0.4)

Преобразование цвета HEX в значение RGB.

Преобразуем белый цвет из HEX в значение RGB:

# определяем функцию преобразования
def hex2rgb(hex):
    return tuple(int(hex[i:i+2], 16) for i in (0, 2, 4))

# белый цвет HEX
>>> hex_color = '#ffffff'
# вырезаем значок `#` 
>>> hex_color = hex_color.lstrip('#')
# преобразовываем в значение RGB
>>> rgb_tuple = hex2rgb(hex_color)
# объединяем аббревиатуру `rgb` с кортежем 
>>> res = 'rgb' + str(rgb_tuple)
>>> res
# 'rgb(255, 255, 255)'

Преобразование цвета RGB в значения HEX.

Преобразуем полученное значение белого цвета RGB в цветовую систему HEX.

# определяем функцию преобразования
def rgb2hex(r, g, b):
    return f'#{r:02x}{g:02x}{b:02x}'

# белый цвет RGB
rgb_color = 'rgb(255, 255, 255)'
# извлекаем из rgb_color цифры в список
import re
color_list = [int(n) for n in re.findall('\d+', rgb_color)]
# вставляем список с распаковкой
res = rgb2hex(*color_list)
res
# '#ffffff'

Функция преобразования значения RGB в цветовую схему CMYK.

def rgb2cmyk(r, g, b, rgb_scale=255, cmyk_scale=100):
    """Преобразование RGB в цветовую систему CMYK"""
    if (r, g, b) == (0, 0, 0):
        # значит черный
        return 0, 0, 0, cmyk_scale
    # rgb [0,255] -> cmy [0, 1]
    c = 1 - r / rgb_scale
    m = 1 - g / rgb_scale
    y = 1 - b / rgb_scale
    # извлекаем k [0, 1]
    min_cmy = min(c, m, y)
    c = (c - min_cmy) / (1 - min_cmy)
    m = (m - min_cmy) / (1 - min_cmy)
    y = (y - min_cmy) / (1 - min_cmy)
    k = min_cmy
    # масштабируем до диапазона [0, cmyk_scale]
    return c * cmyk_scale, m * cmyk_scale, y * cmyk_scale, k * cmyk_scale

>>> rgb_color = (102, 255, 0) # Ярко-зелёный
>>> rgb2cmyk(*rgb_color)
# (60.0, 0.0, 100.0, 0.0)

Функция преобразования значения CMYK в цветовую схему RGB.

def cmyk2rgb(c, m, y, k, cmyk_scale=100, rgb_scale=255):
    """Преобразование CMYK в цветовую систему RGB"""
    c = c / cmyk_scale
    m = m / cmyk_scale
    y = y / cmyk_scale
    k = k / cmyk_scale
    r = round(rgb_scale - ((min(1.0, c * (1.0 - k) + k)) * rgb_scale))
    g = round(rgb_scale - ((min(1.0, m * (1.0 - k) + k)) * rgb_scale))
    b = round(rgb_scale - ((min(1.0, y * (1.0 - k) + k)) * rgb_scale))
    return r, g, b

>>> cmyk_color = (60, 0, 100, 0)  # Ярко-зелёный
>>> cmyk2rgb(*cmyk_color)
# (102, 255, 0)