如何用Lua代码生成指定13×9RGB调色板(无需依赖完整色值表)
基于首行色值生成对称RGB调色板的高效Lua实现
需求拆解
13列9行的对称调色板核心特征是行对称:第1行与第9行完全一致,第2行与第8行一致,第3行与第7行一致,第4行与第6行一致,第5行为中间基准行(通常是首行色值的暗调/中间调变体)。我们仅需基于首行13个十六进制色值,通过亮度线性缩放即可实现完全匹配的对称效果。
核心实现思路
- 色值转换工具:将十六进制色值(如
#FF0000)解析为0-255范围的RGB分量,处理完成后再转回十六进制格式。 - 对称亮度系数生成:生成9个对称的亮度缩放系数,比如从1.0(首行)线性降到0.2(中间行),再线性升回1.0,确保行对称逻辑成立。
- 批量生成调色板:遍历每个亮度系数,对首行所有色值的RGB分量进行缩放(取整并限制范围避免溢出),组合成完整的9行调色板。
高效Lua代码实现
-- 十六进制色值转RGB分量 local function hex2rgb(hex) hex = hex:gsub("#", "") return { tonumber(hex:sub(1,2), 16), tonumber(hex:sub(3,4), 16), tonumber(hex:sub(5,6), 16) } end -- RGB分量转十六进制色值 local function rgb2hex(r, g, b) return string.format("#%02X%02X%02X", math.min(math.max(r, 0), 255), math.min(math.max(g, 0), 255), math.min(math.max(b, 0), 255) ) end -- 生成对称调色板 local function generateSymmetricPalette(firstRow) -- 可根据实际需求调整亮度系数,实现不同明暗渐变效果 local brightnessSteps = {1.0, 0.8, 0.6, 0.4, 0.2, 0.4, 0.6, 0.8, 1.0} local palette = {} -- 预解析首行所有色值的RGB分量,避免重复解析浪费性能 local firstRowRGB = {} for _, hex in ipairs(firstRow) do table.insert(firstRowRGB, hex2rgb(hex)) end -- 逐行生成调色板 for _, step in ipairs(brightnessSteps) do local row = {} for _, rgb in ipairs(firstRowRGB) do local r = math.floor(rgb[1] * step) local g = math.floor(rgb[2] * step) local b = math.floor(rgb[3] * step) table.insert(row, rgb2hex(r, g, b)) end table.insert(palette, row) end return palette end -- 示例使用 local firstRow = {"#FF0000", "#00FF00", "#0000FF", "#FFFF00", "#FF00FF", "#00FFFF", "#FFFFFF", "#CCCCCC", "#999999", "#666666", "#333333", "#000000", "#808080"} local myPalette = generateSymmetricPalette(firstRow) -- 打印验证结果 for i, row in ipairs(myPalette) do print("第" .. i .. "行:" .. table.concat(row, ", ")) end
代码优化说明
- 预解析首行色值:提前将首行所有十六进制色值转为RGB分量,避免在每行循环中重复解析,大幅提升生成效率。
- 边界值安全处理:在
rgb2hex中通过math.min/math.max确保RGB分量始终处于0-255的合法范围,避免色值溢出导致的异常。 - 系数灵活配置:
brightnessSteps数组可根据调色板的明暗需求自由调整,甚至替换为非线性系数实现更自然的渐变效果。
内容的提问来源于stack exchange,提问作者A_CE
相关产品推荐
相关产品推荐

