【MYSQL颜色码转换】RGB格式的颜色值十六进制格式相互转换

工作场景:

        有多个业务系统的数据库对颜色码的存储不一致,现在要对数据做梳理汇总,需把颜色码字段维护成统一格式,以便后续使用。网上有很多的颜色值转换代码,本想CV一把。但没有找到SQL版本的,无奈只能手撸一个。

使用场景及具体SQL

1.RGB格式的颜色值转十六进制格式

-- 颜色表:base_color ,color_rgb为 rgb格式颜色值.用到以下函数和操作:
-- SUBSTRING_INDEX(str, delim, count): 提取字符串str中第count个分隔符delim之前或之后的子字符串。
-- CONV(num, from_base, to_base): 将数字从指定的进制from_base转换为另一种进制to_base。
-- LPAD(str, len, padstr): 在字符串str的左侧添加字符padstr,使其总长度达到len。
-- 通过将每个RGB值转换为十六进制,并使用LPAD函数确保每个十六进制值始终有两位数,然后使用CONCAT函数将它们连接起来形成颜色代码。
select CONCAT('#',
    LPAD(CONV(SUBSTRING_INDEX(SUBSTRING_INDEX(color_rgb, ',', 1), '(', -1), 10, 16), 2, '0'),
    LPAD(CONV(SUBSTRING_INDEX(SUBSTRING_INDEX(color_rgb, ',', -2), ' ', -2), 10, 16), 2, '0'),
    LPAD(CONV(SUBSTRING_INDEX(SUBSTRING_INDEX(color_rgb, ',', -1), ')', 1), 10, 16), 2, '0')
) AS color_value,color_rgb,color_code from base_color;

2.十六进制格式的颜色值转RGB格式


-- 颜色表:base_color ,color_code为16进位值颜色码.使用以下函数和操作:
-- SUBSTRING(str, pos, len): 返回字符串str从位置pos开始的长度为len的子字符串。
-- CONV(expr, from_base, to_base): 将表达式expr从from_base进制转换为to_base进制。
-- CAST(expr AS type): 将表达式expr转换为指定类型type的值。
-- 通过使用SUBSTRING函数提取出十六进制颜色代码中的每个分量,并使用CONV将其从十六进制转换为十进制,然后使用CAST将其转换为无符号整数类型。最后,使用CONCAT函数将分量连接起来形成一个rgb()格式的字符串。
SELECT CONCAT('rgb(', 
    CAST(CONV(SUBSTRING(color_code, 2, 2), 16, 10) AS UNSIGNED), ', ',
    CAST(CONV(SUBSTRING(color_code, 4, 2), 16, 10) AS UNSIGNED), ', ',
    CAST(CONV(SUBSTRING(color_code, 6, 2), 16, 10) AS UNSIGNED),
    ')') AS rgb_value from base_color;

RGB格式的颜色值十六进制格式相互转换原理:

        RGB(Red, Green, Blue)和十六进制颜色代码是表示颜色的两种常用方式。它们之间的转换原理涉及到颜色分量的表示和计算。

         在RGB格式中,颜色由三个分量:红色(R)、绿色(G)和蓝色(B)组成,每个分量的取值范围为0到255。通过调整这三个分量的值,可以生成各种颜色。

在十六进制颜色代码中,颜色由六位十六进制数表示,前两位表示红色分量,中间两位表示绿色分量,最后两位表示蓝色分量。每一对十六进制数可以转换为0到255之间的十进制数。

RGB到十六进制的转换:

  1. 将RGB中的每个分量除以16并取整,得到相应的商和余数。
  2. 将商和余数转换为十六进制数。
  3. 将三个十六进制数按顺序连接起来,即得到十六进制颜色代码。

十六进制到RGB的转换:

  1. 将十六进制颜色代码拆分成三个部分:红色、绿色和蓝色。
  2. 将每个部分的十六进制数转换为十进制数。

具体转换步骤如下:

  • 十六进制到十进制:将每个十六进制位的值乘以相应的权重,权重为16的幂次方(从右到左,依次为16^0、16^1、16^2)。
  • 十进制到十六进制:将十进制数除以16并取整,得到商和余数。然后将商和余数转换为对应的十六进制数字。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值