记一次HEX和RGB互换算法的思考及应用
由于笔者最近在开发可视化平台,所以对动态编辑器这块做了一段时间的研究, 发现其中有个小模块的知识点比较有意思,所以在这里分享一下.
作为前端工程师, 我们平时在对接设计稿的时候, 是不是经常会涉及到颜色值的转换呢? 比如从HEX值转化到RGB值, 亦或者是从RGB值转换到HEX值, 这块在PhotoShop等设计软件中非常常见, 在做类似于画板, 设计类的IDE的时候也经常会用到它们的互相转换, 还有一种场景是,为了满足老板对高大上特效的要求, 我们要让动画在不同的时间显示不同的颜色,而且有过渡效果(过渡效果虽然可以通过transiton来实现),如下:
所以笔者在这里就分享一下HEX与RGB之间相互转换的原理和算法, 并且实现随机生成HEX值和随机生成RGB值的函数,最后带着大家深度理解和掌握颜色领域的应用.
1 文章摘要
-
HEX与16进制 -
HEX转RGB算法 -
RGB转HEX算法 -
应用场景
2 HEX(16进制)
十六进制(英文名称:Hexadecimal),是计算机中数据的一种表示方法。和我们平常的表示法不一样。它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9;A-F对应10-15;N进制的数可以用0~(N-1)的数表示,超过9的用字母A-F。
以上概念非常重要, 这也是我们转换RGB的关键. 还有一个知识点需要我们掌握的就是进制转换. 在计算机基础中我们都知道如何将二进制转化为十进制, 10进制数转换成16进制的方法,和转换为2进制的方法类似,唯一的变化:除数由2变成16. 举个例子, 我们拿140来举例:
被除数 | 计算过程 | 商 | 余数 |
---|---|---|---|
140 | 140/16 | 8 | 14 |
8 | 8/16 | 0 | 8 |
所以140转换为16进制,结果为:7E (由十六进制的定义我们知道14对应的字母为E)
以上就是掌握HEX和RGB互相转换的核心知识点, 接下来我们来看看互相转换的算法实现.
3 HEX转RGB算法
从 HEX 颜色值转换成 RGB 颜色值,本质上是HEX的第一位数乘以16加上第二位数. 举个例子: 转换颜色为 #1821DD的 HEX 值到 RGB 值.
#1821DD ----------> rgb:
18 ----> r: r的值就是: 1 * 16 + 8 = 24
21 ----> g: g的值就是: 2 * 16 + 1 = 33
DD ----> b: b的值就是: 13 * 16 + 13 = 221
以上转换的结果为rgb: (24, 33, 221), 怎么样, 是不是很简单? 接下来我们来看看具体的算法实现:
const hex2rgb = (hex: string = ''):string => {
// 针对于传入错误的hex,即长度不等于7或者不等于4的
if(![4,7].includes(hex.length)) {
throw new Error('格式错误')
}
let result = hex.slice(1)
// 如果是颜色叠值, 统一转换成6位颜色值
if(result.length === 3) {
result = result.split('').map(a => `${a}${a}`).join('')
}
const rgb:number[] = []
// 计算hex值
for(let i=0, len = result.length; i< len; i+=2) {
rgb[i / 2] = getHexVal(result[i]) * 16 + getHexVal(result[i+1])
}
function getHexVal(letter:string):number {
let num:number = -1;
switch(letter.toUpperCase()) {
case "A":
num = 10
break;
case "B":
num = 11
break;
case "C":
num = 12
break;
case "D":
num = 13
break;
case "E":
num = 14
break;
case "F":
num = 15
break;
}
if(num < 0) {
num = Number(letter)
}
return num
}
return `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`
}
当然还有更其他方法可以实现REX转RGB, 大家可以自行探索.
4 RGB转HEX算法
对于RGB转HEX, 方法类似, 只不过相当于上述方法的逆运算, 笔者实现一种思路, 大家可以参考学习:
const rgb2hex = (rgb: string):string => {
let str = rgb.replace(/rgb\((.*)\)/g, '$1')
let strArr = str.split(',').map(t => t.trim())
let result:string[] = []
for(let i:number = 0, len:number = strArr.length; i < len; i++) {
let curVal = Number(strArr[i])
let left = getHexStr(String(Math.floor(curVal / 16)))
let right = getHexStr(String(Math.floor(curVal % 16)))
result[i] = left + right
}
function getHexStr(v:string):string {
let str:string = '';
switch(v) {
case '10':
str = "A"
break;
case '11':
str = "B"
break;
case '12':
str = "C"
break;
case '13':
str = "D"
break;
case '14':
str = "E"
break;
case '15':
str = "F"
break;
}
if(!str) {
str = v
}
return str
}
return `#${result.join('')}`
}
以上就是反转的算法, 大家掌握了吗?接下来我们来聊聊它的应用场景.
5 应用场景
其实颜色单位互换应用在很多领域, 笔者先罗列几个实际场景:
-
单位换算工具
-
WEB IDE调色板
-
动态背景
其实还有很多应用, 大家可以自行发挥哈, 今天的学习就到这了, 请问今天你又博学了吗?
本文分享自微信公众号 - 趣谈前端(beautifulFront)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Mozilla 继续卧薪尝胆:这些年谷歌都对火狐做了什么?
近日,知名开源浏览器 Firefox 所属公司 Mozilla 宣布,因疫情原因裁掉旗下 25% 的员工,此举引发了人们对 Firefox 的经营情况与未来的担忧,也让 Mozilla 曾经颇为成功的开源商业模式遭到质疑。 然而就在裁员事件发生仅一天之后,国外知名科技媒体 ZDNet 爆料,Mozilla 已经与 Google 达成续约协议,Google 搜索在未来 3 年将继续作为 Firefox 浏览器的默认搜索引擎,Google 将为此向 Mozilla 支付约 4 - 4.5 亿美元的年费,总价值或超 13 亿美元。也就是说,刚刚“因财务状况不佳”宣布裁员的 Mozilla,其实根本不差钱? 因疫情原因裁员 8 月 12 日,Mozilla 首席执行官Mitchell Baker 在名为《改变世界,改变 Mozilla》的公开信中透露,公司在 2020 年之前已经做了很多规划,包括对新产品的投资,但由于全球疫情的爆发,公司的经济状况受到严重的影响,这些计划不再可行,裁员也因此变得更加必要。为了“创造新的产品,创建更好的互联网”,组织需要进行大的重组,以确保财务状况的长期稳定。 ...
- 下一篇
【Flutter 专题】98 易忽略的【小而巧】的技术点汇总 (六)
和尚继续补充日常学习中遇到的很实用的技术点; LayoutBuilder 和尚在一些场景下需要根据父类布局大小不同展示不同的子类 Widget,例如和尚在适配大尺寸平板或横竖屏切换等场景时,此时需要用到 LayoutBuilder 和尚理解为尺寸布局构造器; 源码分析 简单分析源码可得,LayoutBuilder 是一个继承自 ConstrainedLayoutBuilder 的构造器;通过 builder 获取一个 BoxConstraints 对象,之后通过检查 constraints 来确定要展示的内容; classLayoutBuilderextendsConstrainedLayoutBuilder<BoxConstraints>{ constLayoutBuilder({ Keykey, LayoutWidgetBuilderbuilder, }):super(key:key,builder:builder); } 案例尝试 和尚通过 GridView 默认展示一行的图标,预期是在大部分设备上展示 4个 item,随着屏幕的变大尽可能多的展示 it...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS8编译安装MySQL8.0.19