найти ближайший к сети безопасный цвет, если у меня есть палитра - PullRequest
2 голосов
/ 06 декабря 2011

Как взять значения r, g, b и сравнить их с веб-версией цветовой палитры, чтобы найти лучшее соответствие для значения r, g, b?

Вот этот: Каков наилучший алгоритм для нахождения ближайшего цвета в массиве к другому цвету?

Но я не думаю, что это то, что мне нужно. Мне просто нужно сравнить r, g, b с веб-безопасным цветом и выяснить, является ли веб-безопасный цвет лучшим выбором.

Редактировать1: удалено

Edit2: Это то, что я до сих пор.

local r, g, b = HSV2RGB(h, s, v)
local dither = copy(WEB_SAFE)
local lmod
for i, v in ipairs(dither) do
        local r2, g2, b2 = Color2RGBA(v)
        local hh, ss, vv = RGB2HSV(r2, g2, b2)
        local a = hh - h
        local b = ss - s
        local c = vv - v
        local mod = a*a + b*b + c*c
        if not lmod or mod < lmod then
                lmod = mod
                r, g, b = r2, g2,b2
        end
end
texture:SetBackgroundColor(r, g, b)

Редактировать 3: Это то, на что это должно быть похоже?

http://imgur.com/LwFGQ

h = от 1 до 360 с шагом 5 pt, s = от 1 до 100, v = 89

1 Ответ

4 голосов
/ 06 декабря 2011

Я не уверен, что HSV является лучшим цветовым пространством для выполнения вычислений - также это цилиндр, а не куб, поэтому ваша формула расстояния (которая будет хорошо работать в RGB) будет давать неподходящие результаты для HSV .

В любом случае безопасная веб-палитра сама по себе является простым цветным кубом RGB с шестью возможными значениями (0-5) для каждого компонента. Вам даже не нужно делать что-то более сложное, чем итерация для получения безопасного веб-цвета из входного цвета: просто определите подходящее безопасное веб-значение для каждого цветового компонента (R, G, B) независимо.

Исходя из поспешного предположения, что значения вашего компонента RGB находятся в диапазоне от 0..255:

local max_color_component_value = 255
local quantum = max_color_component_value / 5

r = quantum * math.floor((r + (quantum / 2)) / quantum)
g = quantum * math.floor((g + (quantum / 2)) / quantum)
b = quantum * math.floor((b + (quantum / 2)) / quantum)

Если используется какой-либо другой диапазон, соответственно отрегулируйте max_color_component_value.

...