stm32 str转hex_3分钟看一个HEX和RGB互换算法的应用

8619bbe830ffac65f5256fcb53fb566b.png

作为前端工程师, 我们平时在对接设计稿的时候, 是不是经常会涉及到颜色值的转换呢? 比如从HEX值转化到RGB值, 亦或者是从RGB值转换到HEX值, 这块在PhotoShop等设计软件中非常常见, 在做类似于画板, 设计类的IDE的时候也经常会用到它们的互相转换, 还有一种场景是,为了满足老板对高大上特效的要求, 我们要让动画在不同的时间显示不同的颜色,而且有过渡效果(过渡效果虽然可以通过transiton来实现),如下:

685ace0192a4b1552770f590f9b67f1c.png
b9193d7b11bf14f83b4a32c15501d45f.png
569f3f3bdaff141d7dcf82a4ae575262.png

所以笔者在这里就分享一下HEXRGB之间相互转换的原理和算法, 并且实现随机生成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来举例:

被除数计算过程商余数140140/1681488/1608

所以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 = 2421 ----> g: g的值就是: 2 * 16 + 1 = 33DD ----> 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]})`}复制代码

当然还有更其他方法可以实现REXRGB, 大家可以自行探索.

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 应用场景

其实颜色单位互换应用在很多领域, 笔者先罗列几个实际场景:

  • 单位换算工具
b017e891bceabac03edd2c33b80968ad.png
  • WEB IDE调色板
40a7e5b26289277be8fac5d1c8bf13f6.png
  • 动态背景
623e2e1c3cb7139ea6f5445da8d5d8f8.png
1560b3181784b33e02aa6a901fd5ffee.png

其实还有很多应用, 大家可以自行发挥哈, 今天的学习就到这了, 请问今天你又博学了吗?

最后,咱给小编:

1. 点赞+关注

2. 点头像关注后多多评论,转发给有需要的朋友。

谢谢!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值