Lua: 颜色渐变函数

我正在尝试创建一个函数,该函数输入两种RGB颜色和一个百分比,然后根据百分比返回两个颜色之间的颜色。

我在某个地方找到了Dec2Hex函数,并觉得它很有用。

现在我尝试过:

function Dec2Hex(nValue) -- http://www.indigorose.com/forums/threads/10192-Convert-Hexadecimal-to-Decimal
    if type(nValue) == "string" then
        nValue = String.ToNumber(nValue);
    end
    nHexVal = string.format("%X", nValue);  -- %X returns uppercase hex, %x gives lowercase letters
    sHexVal = nHexVal.."";
    if nValue < 16 then
        return "0"..tostring(sHexVal)
    else
        return sHexVal
    end
end

function fade_RGB(colour1, colour2, percentage)
    r1, g1, b1 = string.match(colour1, "#([0-9A-F][0-9A-F])([0-9A-F][0-9A-F])([0-9A-F][0-9A-F])")
    r2, g2, b2 = string.match(colour2, "#([0-9A-F][0-9A-F])([0-9A-F][0-9A-F])([0-9A-F][0-9A-F])")
    r3 = (tonumber(r1, 16)/tonumber(r2, 16))*(percentage)
    g3 = (tonumber(g1, 16)/tonumber(g2, 16))*(percentage)
    b3 = (tonumber(b1, 16)/tonumber(b2, 16))*(percentage)
    return "#"..Dec2Hex(r3).. Dec2Hex(g3)..Dec2Hex(b3)
end

我认为我正在朝着正确的方向前进,但数学不正确,我无法解决它。提前致谢!

点赞
用户5666571
用户5666571

如果我没错的话,这一行

r3 = (tonumber(r1, 16)/tonumber(r2, 16))*(percentage)

应该改成

r3 = math.abs(tonumber(r1, 16) - tonumber(r2, 16))*(percentage/100)

其他类似的行都遵循相同的概念。

编辑:

r3 = math.min(tonumber(r1, 16), tonumber(r2, 16)) +
    math.abs(tonumber(r1, 16) - tonumber(r2, 16)) * (percentage/100)

应该为 fade_RGB("#FF0000", #0000FF, 0) 显示红色,为 fade_RGB("#FF0000", #0000FF, 100) 显示蓝色。

2016-02-04 00:36:50
用户3069115
用户3069115

No Name 的答案几乎正确,但他没有根据百分比合并这两种颜色。

相反,你想要做的是对这两个值进行线性插值(虽然从人的视觉/光学角度来看,这不是插值颜色的方式,但许多库都这样做,因为它很简单,适用于简单的情况)。

r3 = tonumber(r1, 16)*(100-percentage)/100.0 + tonumber(r2, 16)*(percentage)/100.0

正如你可能注意到的,把百分比乘以100再除以100有些繁琐,所以你可能想直接传入已经除过的百分比。

2016-02-04 02:06:48