丰富有趣的颜色空间

news/2024/11/15 2:07:48/文章来源:https://www.cnblogs.com/skmcj/p/18353565

简介

颜色是视觉的表现,而自然界的颜色是多姿多彩的,如果让我们用语言描述一个自然界的颜色,有些人可能会用红橙黄绿蓝靛紫,外加一些修饰词,但它不太能够准确的描述一个颜色;有些人可能会用RGB,这其实就是一直颜色空间

颜色空间就像是一套套颜色语言,其将视觉上的颜色以数字的形式定义表示,使其能够准确描述某个颜色。简单地说就是颜色的数字化。不同颜色空间表达的颜色范围、适用范围也不尽相同,如常见的RGB,则主要使用于数字显示器使用,而CMYK则比较适用于印刷作品,一般情况下,RGB的颜色范围会比CMYK更广,这涉及到不同颜色空间对颜色的定义表示,接下来,将会详细介绍几种常用的颜色空间

色轮

在进入正题前,先看看下列这张图

color

思考一下,在前端界面中,如果我们想实现类似上图的色轮,一般要怎么实现?

  • 最简单想到的也许就是图片,准备好一张色轮图片,然后显示,用标签显示或canvas绘制

  • 也可以用js操作,根据某种规则计算每一个像素的颜色,然后用canvas绘制显示

  • 这里分享一种比较简单的实现方式,即CSS

    • 显示准备一个盒子容器,给它设置好基础样式,如大小圆角等

    • 然后给其添加以下CSS即可

/* 方法一: radial-gradient */
background: radial-gradient(circle at 50% 0,red,rgba(242, 13, 13, 0.8) 10%,rgba(230, 26, 26, 0.6) 20%,rgba(204, 51, 51, 0.4) 30%,rgba(166, 89, 89, 0.2) 40%,hsla(0, 0%, 50%, 0) 50%
),
radial-gradient(circle at 85% 15%,#ffbf00,rgba(242, 185, 13, 0.8) 10%,rgba(230, 179, 26, 0.6) 20%,rgba(204, 166, 51, 0.4) 30%,rgba(166, 147, 89, 0.2) 40%,hsla(45, 0%, 50%, 0) 50%
),
radial-gradient(circle at 100% 50%,#80ff00,rgba(128, 242, 13, 0.8) 10%,rgba(128, 230, 26, 0.6) 20%,rgba(128, 204, 51, 0.4) 30%,rgba(128, 166, 89, 0.2) 40%,hsla(90, 0%, 50%, 0) 50%
),
radial-gradient(circle at 85% 85%,#00ff40,rgba(13, 242, 70, 0.8) 10%,rgba(26, 230, 77, 0.6) 20%,rgba(51, 204, 89, 0.4) 30%,rgba(89, 166, 108, 0.2) 40%,hsla(135, 0%, 50%, 0) 50%
),
radial-gradient(circle at 50% 100%,#0ff,rgba(13, 242, 242, 0.8) 10%,rgba(26, 230, 230, 0.6) 20%,rgba(51, 204, 204, 0.4) 30%,rgba(89, 166, 166, 0.2) 40%,hsla(180, 0%, 50%, 0) 50%
),
radial-gradient(circle at 15% 85%,#0040ff,rgba(13, 70, 242, 0.8) 10%,rgba(26, 77, 230, 0.6) 20%,rgba(51, 89, 204, 0.4) 30%,rgba(89, 108, 166, 0.2) 40%,hsla(225, 0%, 50%, 0) 50%
),
radial-gradient(circle at 0 50%,#7f00ff,rgba(128, 13, 242, 0.8) 10%,rgba(128, 26, 230, 0.6) 20%,rgba(128, 51, 204, 0.4) 30%,rgba(128, 89, 166, 0.2) 40%,hsla(270, 0%, 50%, 0) 50%
),
radial-gradient(circle at 15% 15%,#ff00bf,rgba(242, 13, 185, 0.8) 10%,rgba(230, 26, 179, 0.6) 20%,rgba(204, 51, 166, 0.4) 30%,rgba(166, 89, 147, 0.2) 40%,hsla(315, 0%, 50%, 0) 50%
);
/* 方法二: conic-gradient */
background: conic-gradient(red,yellow,lime,aqua,blue,fuchsia,red);
  • 以上两种CSS方式均可实现差不多的效果,兼容性前者会比后者略好,具体可看下图:

  • gradient

颜色空间

接下来,开始进入正题,以下是几种常见的颜色空间介绍

RGB

RGB可以算是最常用的一个颜色模型了,主要用于数字显示设备,其原理主要是将R绿GB三色光按不同强度进行叠加,以表现出各种颜色,形式可参考下图:

rgb1

在数字表示上,我们通常用一个三元组(r, g, b)显示,元组中的每一位分别表示对应颜色光的强度

可以用不同的方式量化:

  • 用从01的浮点数表示
  • 用百分比表示,从0%100%
  • 最常用的则是用0-255的整数表示
    • 该方法主要是由于计算机采用1字节存储该值,即8 bit,最大数值为28-1
    • 故在这种表示方法中,RGB共有2563,即16777216

当值均为0时,即无光,表示为黑色rgb(0, 0, 0),当值均为最大时,表示为白色rgb(255, 255, 255)

几何模型大致可参考下图:

rgb

HEX

有时会用6位的16进制表示RGB颜色,每个分量用两位十六进制值00 - FF

有时,还会见到一些用四元组表示的RGB颜色,此时,第四位表示不透明度Alpha,如rgba(16, 28, 99, 0.5),用16进制即为#101C6380(最后两位16进制值表示不透明度)

CMYK

CMYK是一种主要用于印刷行业的颜色模型,其原理是将C(青色Cyan),M(品红色Magenta),Y(黄色Yellow),K(黑色Black)四种颜色颜料进行叠加,从而形成各种颜色,其中,K的作用是加深暗部色调,使黑足够黑,因为单纯的CMY三色很难混合出纯正的黑,最多不过是黑褐色罢了,形式可参考下图:

cmyk

在数字表示上,常用一个四元组表示,元组内分量用百分比表示

HSV/HSB

HSVHSB是相同的颜色模型,只是叫法不同,其是用颜色的直观特性定义颜色,模型中的参数分别表示颜色的色调(色相)H饱和度S明度V

色调H

数值用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°

饱和度S

主要表示颜色接近光谱色的程度,用0% ~ 100%的百分比表示,值越大越饱和。一种颜色,可以看成是某种光谱色与白色混合的结果,其中光谱色所占的比例越大,颜色的饱和度也就越高,饱和度高,颜色越深

另一种简单的理解可想像为水彩颜料,作画时需往里加水,加的谁越多,颜色越浅,饱和度越低

明度V

明度表示颜色明亮的程度或者说纯度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关,取值范围通常为0% ~ 100%(暗 ~ 明)

具体的形式可参考下图:

hsv

从模型可以看出,H色调控制颜色的名称、类型(即哪一个颜色);而颜色的冷暖、色调、明暗受SV|B共同影响

HSL

HSLHSB类似,但并不相同,是两个不同的颜色模型,其参数分别表示颜色的色调(色相)H饱和度S亮度L

色调H

HSB一致,数值用角度度量,取值范围为0°~360°,用于表示颜色在色环上的位置

饱和度S

表示颜色的纯度,用0% ~ 100%的百分比表示,值越大越饱和,颜色越纯(彩),值越小,颜色越灰

亮度L

亮度表示颜色的明亮程度,对于光源色,取值范围通常为0% ~ 100%(黑 ~ 白),但值为0%时,颜色必定为黑,值为100%时,颜色为白

具体的形式可参考下图:

colorizer.org#hsl

从模型可看出,H控制颜色色调,与HSV一致;而S主要控制颜色的灰度冷暖;L控制颜色的明亮程度,由黑到Hue颜色再到白

HSV与HSL对比

具体可参考下图:

img

图中用一致的圆柱坐标表示,使对比更加直观,简单分析一下

  • 如果要表示纯黑纯白两个颜色,HSL只需控制L的值即可,而HSV需同时控制SV的值

LAB

全称为CIE-LAB,是在1931年国际照明委员会CIE制定的颜色度量国际标准的基础上建立起来的,到了1976年,经修改后确立

LAB是基于人对颜色的感觉来设计的,更具体地说,它是感知均匀,简单地说就是其变化的幅度与人在视觉上感受到的变化幅度差不多

其中:

  • L主要表示颜色的亮度,取值范围为[0, 100],从纯黑到纯白
  • A表示从红色到绿色的范围,取值为[-128, 127]
  • B表示从黄色到蓝色的范围,取值为[-128, 127]

具体形式可参考下图:

lab

LAB的色域是极大的,比上面提到的都大,可以在多个领域中起到关键作用,尤其是在需要高精度颜色管理和校准的应用中

一个常见的用途就是作为中间色,用于在不同设备之间进行颜色转换,例如,从RGBCMYK的转换通常会先转换到LAB颜色空间,再转换到目标颜色空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/781314.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Struts2基础1--创建一个Struts2 Web应用程序

Struts2不仅仅是Struts1 的升级版本,更是一个全新的Struts架构,是当前较为普及和成熟的基于MVC设计模式的Web应用程序框架,并在RIA(Rich Internet Applications)Web应用程序开发中得到了广泛应用,成为最好的Web框架之一。本文将通过详细的步骤来说明如何下载获取相关资源…

STM32学习记录(九):RTC

RTC框图 实时时钟(Real-time clock: RTC)是一个独立的计时器。RTC提供一组连续运行的计数器,可以与合适的软件一起使用,以提供时钟日历功能。可以写入计数器值以设置系统的当前时间/日期。可以选择以下三种作为RTC时钟源:HSE时钟进行128分频 LSE振荡器时钟 LSI振荡器时钟有关…

炒鸡好用的Markdown语法

简介 Markdown是一种轻量级标记语言,它最初由John Gruber和Aaron Swartz在2004年共同创建,可以通过简单、纯文本的语法,快速构建格式化、排版精美的文档。其可与HTML混编,可导出为HTML、PDF、Word等格式的文件 Markdown可以让作者更多地关注内容本身而非格式排版。同样的内…

Arweave区块链私有化部署

Arweave区块链私有化部署Arweave区块链主打数据永久存储,即保存在区块链的数据永久存在、不可篡改。公链主网络arweave.N.1在2024年8月11日累计产生了148万个区块(见下截图所示),区块还在不断产生,大约2分钟产生一个区块。Arweave区块链可以在Ubuntu 22.04LTS或Ubuntu 24.04…

多线程复习总结

1基本概念 1什么是进程什么是线程 进程:是程序执行一次的过程,他是动态的概念,是资源分配的基本单位。一个应用程序(1个进程是一个软件)。 线程:一个进程可以有多个线程,线程是cpu调度的单位,一个进程中的执行场景/执行单元。 对于java程序来说,当在DOS命令窗口中输入…

kubernetes-POD的基本原理

目录什么是POD?POD有以下特点:为什么使用POD作为最小单元,而不是container为什么允许一个POD里有多个容器POD中如何管理多个容器POD的yaml格式定义配置文件说明如何使用PodPOD的持久性和终止Pause我们首先在节点上运行一个pause容器然后再运行一个nginx容器,nginx将为localh…

【投资认知】- 2024Q1的英伟达NVIDIA

来自关注的Twitter博主@ZeevyInvesting 💡 Investing visuals | 📜 One-pager analysis | 📈 Tech portfolio updates | 🥊 Business Battles来源:https://twitter.com/ZeevyInvesting/status/1801691822705512947名词解释CAGR:复合年增长率(Compound Annual Grow…

【1.0版】【MYSQL安全】sql注入系列:基于报错的 SQL 盲注

主题 sql注入:基于报错的 SQL 盲注一、Floor报错注入1.1 floor 函数1.2 rand函数 1.3 count(*) 1.4 floor函数实际利用二、extractvalue函数三、updatexml函数:同extractvalue本来网页是不显示信息的,但是我们可以构造 payload 让信息通过错误提示回显出来一、Floor报错注入…

CISC和RISC

CISC的特点RISC的特点CISC和RISC的比较如何分辨CISC和RISCCISC的指令不定长,RISC的指令都是定长的 RISC中只有Load\Store类指令可以访问主存

P1502 窗口的星星 题解

题目传送门。 思路 扫描线 扫描线 首先,将题目中给出的条件和问题进行转化: 首先先不考虑边框上的点不算在内的限制,考虑一个点可以对那些矩形产生贡献。 只考虑矩形的右上角,容易发现,每个星星的亮度只对右上角在以星星为左下角的长为 \(W\),高为 \(H\)的矩形有贡献。 如…

bugbountyhunter scope BARKER:第7滴血 存储型 XSS 编码测试和多处引用 报告

注册后,来到UI Display Name处直接点击更新之后,发现反射值的存在尝试一些编码,发现没有任何转换。编码测试更简单,语义一把梭:比如各种华丽花哨的编码到落地并没有被还原成 <>"等语义,此处没有漏洞 https://github.com/swisskyrepo/PayloadsAllTheThings/tre…