Lua 颜色值转换 -- Color

5 篇文章 0 订阅

定义脚本 ColorTools.lua

--[[
备注 : 色值格式化、转换和定义
]]
----------------------------------------------------------------------------------------------
local strfmt = string.format
local strsub = string.sub
----------------------------------------------------------------------------------------------
--[[doc: 通道默认数值]]
local channel_default = 255

--[[doc: 24位默认十六进制字符串]]
local hex24_default = '#FFFFFF'

--[[doc: 32位默认十六进制字符串]]
local hex32_default = '#FFFFFFFF'

--[[doc: 24位默认RGB色值]]
local rgb_default = {
    r = channel_default,
    g = channel_default,
    b = channel_default
}

--[[doc: 32位默认RGB色值]]
local rgba_default = {
    r = rgb_default.r,
    g = rgb_default.g,
    b = rgb_default.b,
    a = channel_default
}

--[[func: 转换为可用的色位]]
local function to_color_bit(color)
    color = tonumber(color)
    if color and color <= channel_default and channel_default >= 0 then
        return color
    end
    return channel_default
end

--[[func: 转换为有效的色值]]
local function to_valid_color(color)
    if type(color) ~= 'table' then
        return rgba_default
    end

    color.r = to_color_bit(color.r)
    color.g = to_color_bit(color.g)
    color.b = to_color_bit(color.b)
    color.a = to_color_bit(color.a)
end

--[[func: 从十六进制字符串转为色位 -- 将16进制 转换成 10 进制。 如: tonumber("FF", 16) = 255]]
local function str_to_hex_num(hex)
    return tonumber(hex, 16) or channel_default
end

--[[func: 数值转换为十六进制字符串 -- 将10进制数字 转换成 16进制 字符串。如 string.format('%02X', 255) = "FF"]]
local function num_to_hex_str(value)
    return strfmt('%02X', to_color_bit(value))
end

--[[func: 从十六进制字符串转换 -- 将16进制表示的颜色值 转换成 10进制表示的颜色值。如 "#7FFFFF00" -> color = {r = 127,g = 255,b = 255,a = 00} ]]
local function hex_to_color(hex)
    local len = string.len(hex)
    if len < 7 then
        return rgb_default
    end

    if strsub(hex, 1, 1) ~= '#' then
        return rgb_default
    end

    local color = {
        r = to_color_bit(str_to_hex_num(strsub(hex, 2, 3))),
        g = to_color_bit(str_to_hex_num(strsub(hex, 4, 5))),
        b = to_color_bit(str_to_hex_num(strsub(hex, 6, 7))),
        a = channel_default
    }

    if len == 9 then
        color.a = to_color_bit(str_to_hex_num(strsub(hex, 8, 9)))
    end

    return color
end

--[[func: 从十六进制字符串转换 并将颜色单位化 -- 将16进制表示的颜色值 转换成 10进制表示的颜色值。如 "#7FFFFF00" -> color = {r = 0.5,g = 1.0,b = 1.0,a = 0.0} ]]
local function hex_to_color_unit(hex)
    local color = hex_to_color(hex)
    local color_unit = {
        r = color.r / channel_default,
        g = color.g / channel_default,
        b = color.b / channel_default,
        a = color.a / channel_default,
    }
    return color_unit
end

--[[func: 从数值表转换 -- {255,0,255,128} -> {r = 255,g = 0,b = 255,a = 128}]]
local function tab_to_color(tbl)
    return {
        r = to_color_bit(tbl[1]),
        g = to_color_bit(tbl[2]),
        b = to_color_bit(tbl[3]),
        a = to_color_bit(tbl[4])
    }
end

--[[func: 转为为数值表 -- {r = 255,g = 0,b = 255,a = 128} -> {255,0,255,128}]]
local function color_to_tab(color)
    to_valid_color(color)
    return { color.r, color.g, color.b, color.a }
end

--[[func: 转换为十六进制(24位)-- {r = 255,g = 255,b = 0} -> '#FFFF00']]
local function color_to_hex24(color)
    if type(color) ~= 'table' then
        return hex24_default
    end

    if not color.r or not color.g or not color.b then
        return hex24_default
    end

    local hex = '#'
    hex = hex .. num_to_hex_str(color.r)
    hex = hex .. num_to_hex_str(color.g)
    hex = hex .. num_to_hex_str(color.b)
    return hex
end

--[[func: 转换为十六进制(32位)-- {r = 255,g = 255,b = 0,a = 255} -> '#FFFF00FF']]
local function color_to_hex32(color)
    return color_to_hex24(color) .. num_to_hex_str(color.a)
end

----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
ColorTools = {
    --[[doc: 方法定义]]
    FromHex = hex_to_color,
    FromHexUnit = hex_to_color_unit,
    FromTab = tab_to_color,
    ToTab = color_to_tab,
    ToHex24 = color_to_hex24,
    ToHex32 = color_to_hex32,
    ToHex = color_to_hex24,

    --[[doc: 色值定义]]
    Hex = {
        --[[doc: 红色 光的三原色之一]]
        Red    = '#FF0000',
        --[[doc: 绿色 光的三原色之一]]
        Green = '#00FF00',
        --[[doc: 蓝色 光的三原色之一]]
        Blue    = '#0000FF',
        --[[doc: 白色 等量的三原色光相加为白光]]
        White = '#FFFFFF',
        --[[doc: 黄色 颜料三原色之一]]
        Yellow = '#FFFF00',
        --[[doc: 品红 颜料三原色之一]]
        Magenta = '#FF00FF',
        --[[doc: 青色 颜料三原色之一 与 Cyan 异名同色]]
        Aqua    = '#00FFFF',
        Cyan    = '#00FFFF',
        --[[doc: 黑色 颜料三原色混合为黑色]]
        Black = '#000000',
    }
}
-- return ColorTools

调用参考

ColorTools.FromHex('#FF0000') --> {r = 255,g = 0,b = 0,a = 255}

ColorTools.FromHexUnit('#FF0000') --> {r = 1.0,g = 0.0,b = 0.0,a = 1.0}

local tab1 = { 255, 0, 255, 128 }
ColorTools.FromTab(tab1) --> {r = 255,g = 0,b = 255,a = 128}

local tab2 = { r = 255, g = 255, b = 0 }
ColorTools.ToHex24(tab2) --> '#FFFF00'

local tab3 = { r = 255, g = 255, b = 0, r = 255 }
ColorTools.ToHex32(tab2) --> '#FFFF00FF'

local tab4 = { r = 255, g = 255, b = 0 }
ColorTools.ToHex(tab4) --> '#FFFF00'

其它参考

可以参考下面这两个github上的处理:

https://github.com/k2052/color.lua

https://github.com/Perkovec/colorise-lua

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值