跳转到主要内容

转换和操作各种颜色表示(HSL、RVB、web、X11、...)

项目描述

Latest PyPI version License Compatible python versions Number of PyPI downloads Travis CI build status Appveyor CI build status Test coverage

转换和操作常见颜色表示(RGB、HSL、web、…)

特性

  • 简单且Pythonic的方式来操作颜色表示(见下面的示例)

  • 全转换之间的RGB、HSL、6位十六进制、3位十六进制、人类颜色

  • 一个对象(Color)或一系列单一用途函数(rgb2hexhsl2rgb …)

  • web 格式使用6位(例如 #fa3b2c)、3位(例如 #fbb)、全拼写颜色(例如 white)之间的最小表示,遵循 W3C颜色命名 以兼容CSS或HTML颜色规范。

  • 平滑直观的颜色量表生成选择N个颜色渐变。

  • 可以帮助您选择颜色以识别应用程序中的对象。

安装

由于colour可在PyPI上使用,您无需下载代码的GIT版本。因此,您应该能够运行

pip install colour

如果您已下载GIT源代码,则可以将colour.py直接添加到您的site-packages中(感谢符号链接)。或者通过传统方式安装当前版本

python setup.py install

如果您没有GIT源代码,但希望从github获取最新的master分支,您也可以

pip install git+https://github.com/vaab/colour

甚至选择特定的修订版(分支/标签/提交)

pip install git+https://github.com/vaab/colour@master

用法

要获取每个函数的完整演示,请阅读源代码,它提供了大量doctest格式的示例。

这里是一个常见的使用场景的简化示例

实例化

让我们创建蓝色

>>> from colour import Color
>>> c = Color("blue")
>>> c
<Color blue>

请注意,以下所有示例都是创建红色的等效示例

Color("red")           ## human, web compatible representation
Color(red=1)           ## default amount of blue and green is 0.0
Color("blue", hue=0)   ## hue of blue is 0.66, hue of red is 0.0
Color("#f00")          ## standard 3 hex digit web compatible representation
Color("#ff0000")       ## standard 6 hex digit web compatible representation
Color(hue=0, saturation=1, luminance=0.5)
Color(hsl=(0, 1, 0.5)) ## full 3-uple HSL specification
Color(rgb=(1, 0, 0))   ## full 3-uple RGB specification
Color(Color("red"))    ## recursion doesn't break object

读取值

有几种表示形式可供访问

>>> c.hex
'#00f'
>>> c.hsl  # doctest: +ELLIPSIS
(0.66..., 1.0, 0.5)
>>> c.rgb
(0.0, 0.0, 1.0)

并且它们的各个部分也可以独立访问,就像RGB格式中的红色、蓝色和绿色的不同数量

>>> c.red
0.0
>>> c.blue
1.0
>>> c.green
0.0

或者是HSL表示法中的色调、饱和度和亮度

>>> c.hue  # doctest: +ELLIPSIS
0.66...
>>> c.saturation
1.0
>>> c.luminance
0.5

关于.hex属性的一则说明,如果可能,它会返回最小的有效值。如果您只对长值感兴趣,请使用.hex_l

>>> c.hex_l
'#0000ff'

修改颜色对象

所有这些属性都是可读/写的,所以让我们给这个颜色添加一些红色

>>> c.red = 1
>>> c
<Color magenta>

我们可能想要降低这个颜色的饱和度

>>> c.saturation = 0.5
>>> c
<Color #bf40bf>

当然,字符串转换将给出人类可读的表示,或者是3位或6位的十六进制表示,具体取决于哪个是可用的

>>> "%s" % c
'#bf40bf'

>>> c.luminance = 1
>>> "%s" % c
'white'

颜色范围

您可以很容易地获取两个.Color对象之间的颜色变化范围。这里,是红到蓝的彩虹颜色范围

>>> red = Color("red")
>>> blue = Color("blue")
>>> list(red.range_to(blue, 5))
[<Color red>, <Color yellow>, <Color lime>, <Color cyan>, <Color blue>]

或者是黑到白的灰色不同数量

>>> black = Color("black")
>>> white = Color("white")
>>> list(black.range_to(white, 6))
[<Color black>, <Color #333>, <Color #666>, <Color #999>, <Color #ccc>, <Color white>]

如果您必须创建红到绿('lime'颜色是全绿色)之间的颜色范围图形表示

>>> lime = Color("lime")
>>> list(red.range_to(lime, 5))
[<Color red>, <Color #ff7f00>, <Color yellow>, <Color chartreuse>, <Color lime>]

注意黄色是如何自然地显示在人类格式和刻度中间的。并且,非常不寻常(但兼容)的'chartreuse'颜色规范已经用于替代十六进制表示

颜色比较

合理的默认值

颜色比较是一个广泛的主题。然而,它可能对您来说非常直接。《色彩》使用可配置的默认比较方式,可能适合您的需求

>>> Color("red") == Color("#f00") == Color("blue", hue=0)
True

默认比较算法仅关注“web”表示形式,这相当于比较长十六进制表示形式(例如#FF0000),或者更具体地说,它相当于比较RGB表示中的红色、绿色和蓝色的组成数量,这些值均量化为256值刻度。

这种默认比较是一种实际且方便的方式来衡量您屏幕或视频卡内存中实际颜色的等效性。

但这种比较不会区分黑红色和黑蓝色,这两种颜色都是黑色

>>> black_red = Color("red", luminance=0)
>>> black_blue = Color("blue", luminance=0)

>>> black_red == black_blue
True

自定义

但是,这不是比较两种颜色的唯一方式。由于我相当懒惰,我提供了一种自定义它以满足您需求的方法。因此

>>> from colour import RGB_equivalence, HSL_equivalence
>>> black_red = Color("red", luminance=0, equality=HSL_equivalence)
>>> black_blue = Color("blue", luminance=0, equality=HSL_equivalence)

>>> black_red == black_blue
False

如您所猜测的,合理的默认值是.RGB_equivalence,所以

>>> black_red = Color("red", luminance=0, equality=RGB_equivalence)
>>> black_blue = Color("blue", luminance=0, equality=RGB_equivalence)

>>> black_red == black_blue
True

这是您如何实现您独特的比较函数的方法

>>> saturation_equivalence = lambda c1, c2: c1.saturation == c2.saturation
>>> red = Color("red", equality=saturation_equivalence)
>>> blue = Color("blue", equality=saturation_equivalence)
>>> white = Color("white", equality=saturation_equivalence)

>>> red == blue
True
>>> white == red
False

注意:在比较两种颜色时,仅使用第一个颜色的相等性函数。

>>> black_red = Color("red", luminance=0, equality=RGB_equivalence)
>>> black_blue = Color("blue", luminance=0, equality=HSL_equivalence)

>>> black_red == black_blue
True

但反向操作并不等效!

>>> black_blue == black_red
False

与非.Color对象的相等性

作为旁注,无论您的自定义相等性函数是什么,如果您与任何非.Color实例进行比较,它将不会被使用

>>> red = Color("red", equality=lambda c1, c2: True)
>>> blue = Color("blue", equality=lambda c1, c2: True)

请注意,这些实例将与其他任何颜色视为相等

>>> red == blue
True

但与另一个非.Color对象

>>> red == None
False
>>> red != None
True

实际上,.Color实例将礼貌地给另一边的相等性一个机会来决定输出(通过执行自己的.__eq__),因此

>>> class OtherColorImplem(object):
...     def __init__(self, color):
...         self.color = color
...     def __eq__(self, other):
...         return self.color == other.web

>>> alien_red = OtherColorImplem("red")
>>> red == alien_red
True
>>> blue == alien_red
False

并且不等式(使用.__ne__)也是礼貌的

>>> class AnotherColorImplem(OtherColorImplem):
...     def __ne__(self, other):
...         return self.color != other.web

>>> new_alien_red = AnotherColorImplem("red")
>>> red != new_alien_red
False
>>> blue != new_alien_red
True

为Python对象选择任意颜色

基本用法

有时,您只是想为应用程序中的对象选择一种颜色,通常是为了视觉上识别该对象。因此,所选颜色应与相同对象相同,与不同对象不同

>>> foo = object()
>>> bar = object()

>>> Color(pick_for=foo)  # doctest: +ELLIPSIS
<Color ...>
>>> Color(pick_for=foo) == Color(pick_for=foo)
True
>>> Color(pick_for=foo) == Color(pick_for=bar)
False

当然,虽然不同字符串产生相同颜色的概率很小,但大多数情况下,不同的输入会产生不同的颜色。

高级用法

您可以通过提供picker来自定义颜色选择算法。一个picker是一个可调用的函数,它接受一个对象,并返回可以被Color实例化的某个对象。

>>> my_picker = lambda obj: "red" if isinstance(obj, int) else "blue"
>>> Color(pick_for=3, picker=my_picker, pick_key=None)
<Color red>
>>> Color(pick_for="foo", picker=my_picker, pick_key=None)
<Color blue>

您可能想使用特定的picker,但强制执行picker如何识别两个对象为相同(或不相同)。因此,提供了一个默认为hash方法的pick_key属性,如果您的对象不支持hash方法,则默认为对象字符串与类名混合。

因此

>>> class MyObj(str): pass
>>> my_obj_color = Color(pick_for=MyObj("foo"))
>>> my_str_color = Color(pick_for="foo")
>>> my_obj_color == my_str_color
False

在使用RGB_color_picker选择机制之前,请确保您的对象是可哈希的或“可转换为字符串”的,或者提供另一个颜色picker。几乎所有Python对象默认都是可哈希的,所以这不应该成问题(例如,object实例及其子类都是可哈希的)。

neitherhash nor str都不是完美的解决方案。因此,在Color实例化时,请随时使用pick_key来设置您识别对象的方式,例如

>>> a = object()
>>> b = object()
>>> Color(pick_for=a, pick_key=id) == Color(pick_for=b, pick_key=id)
False

在选择pick key时,您应该仔细考虑是否希望在运行之间保持颜色的一致性(这与最后一个示例不同),或者如果它是可变对象,则与对象的内容保持一致。

pick_keypicker的默认值确保对于大多数Python对象,在不同的计算机上的不同运行中,相同的颜色会被分配给相同的对象。

颜色工厂

如您所注意到的,有一些属性,您可能希望将其附加到所有颜色上,以支持相等性比较,或配置对象颜色picker的pickerpick_key

您可以通过make_color_factory创建自定义的Color工厂。

>>> from colour import make_color_factory, HSL_equivalence, RGB_color_picker

>>> get_color = make_color_factory(
...    equality=HSL_equivalence,
...    picker=RGB_color_picker,
...    pick_key=str,
... )

所有通过CustomColor类创建的颜色默认都会获得指定的属性。

>>> black_red = get_color("red", luminance=0)
>>> black_blue = get_color("blue", luminance=0)

当然,这些都是Color类的实例。

>>> isinstance(black_red, Color)
True

相等性已从正常默认值更改,因此

>>> black_red == black_blue
False

这是因为Color的默认等价性被设置为HSL_equivalence

贡献

欢迎任何建议或问题。请推送请求,请查阅指南。

推送请求指南

您可以发送任何代码。我会查看它,并在代码库中自己集成,并保留您作为作者。这个过程可能需要时间,如果您遵循以下指南,则所需时间会更短。

  • 使用PEP8或pylint检查您的代码。尽量保持80列宽。

  • 按最小关注点分开您的提交。

  • 每个提交都应该通过测试(以便轻松二分)

  • 每个功能/错误修复提交应包含代码、测试和文档。

  • 优先考虑带有排版或代码美化更改的较小提交。这些应该在提交摘要中用!minor标记。

  • 提交消息应遵循gitchangelog规则(检查git日志以获取示例)

  • 如果提交修复了问题或完成了功能实现,请将其在摘要中提及。

如果您对这里没有回答的指南有疑问,请检查当前的git log,您可能会找到以前的提交,该提交显示了如何处理您的问题。

许可证

版权(c)2012-2017 Valentin Lab。

根据BSD许可证许可。

变更日志

0.1.4 (2017-04-19)

修复

  • rgb2hsl 当红色、蓝色和绿色分量都非常接近 1.0 时,会产生无效的 HSL 三元组。(修复了 #30)[Valentin Lab]

    通常,饱和度会超出范围 0.0..1.0。这可能导致在尝试将此 HSL 三元组重新转换为 RGB 值时抛出异常。

0.1.3 (2017-04-08)

修复

  • 使用 != 运算符时出现意外行为。(修复了 #26)[Valentin Lab]

  • 增加了对 hex_l 属性的提及。(修复了 #27)[Valentin Lab]

0.1.2 (2015-09-15)

修复

  • 支持 1 宽范围的 range_to 颜色刻度。(修复了 #18)[Valentin Lab]

0.1.1 (2015-03-29)

修复

  • 避免在比较非 Colour 实例时抛出异常。(修复了 #14)[Riziq Sayegh]

0.0.6 (2014-11-18)

新功能

  • 通过组合其他现有功能提供所有缺失的 2 个函数(修复了 #13)。[Valentin Lab]

  • 在 HSL、RGB、HEX 便捷实例中提供对任何颜色名称的完全访问。[Valentin Lab]

    现在您可以直接调用 colour.HSL.cyancolour.HEX.red,将人类颜色标签直接编码到 3 种表示形式。

0.0.5 (2013-09-16)

新功能

  • 颜色名称不区分大小写。[Chris Priest]

    颜色名称结构中的名称首字母大写。由一个单词组成的颜色名称将显示为小写。

修复

  • 现在使用 W3C 颜色推荐。[Chris Priest]

    之前使用 X11 颜色方案,它与 W3C 网页颜色规范略有不同。

  • 许可证信息不一致(删除了 GPL 提及)。(修复了 #8)[Valentin Lab]

  • setup.py 的依赖项列表中删除了 gitchangelog。(修复了 #9)[Valentin Lab]

0.0.4 (2013-06-21)

新功能

  • 添加 make_color_factory 以自定义一些常见颜色属性。[Valentin Lab]

  • 选择颜色以识别任何 Python 对象(修复了 #6)[Jonathan Ballet]

  • 颜色之间的等价性支持,如果需要则可自定义。(修复了 #3)[Valentin Lab]

0.0.3 (2013-06-19)

新功能

  • Colour 现在与 python3 兼容。[Ryan Leckey]

0.0.1 (2012-06-11)

  • 首次导入。[Valentin Lab]

待办事项

  • ANSI 16-颜色和 256-颜色转义序列生成

  • 支持 YUV、HSV、CMYK

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定要选择哪个,请了解有关 安装包 的更多信息。

源分发

colour-0.1.5.tar.gz (24.8 kB 查看散列

上传时间

构建分发

colour-0.1.5-py2.py3-none-any.whl (23.8 kB 查看散列

上传时间 Python 2 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面