Как найти ближайший цвет

D

deleted-user-422095

Гость
Автор темы
Версия MoonLoader
.026-beta
Lua:
color_name = {
{"Абрикосовый", "FBCEB1", "251, 206, 177"},
{"Абрикосовый Крайола", "FDD9B5", "253, 217, 181"},
{"Агатовый серый", "B5B8B1", "181, 184, 177"},
{"Аквамариновый", "7FFFD4", "127, 255, 212"},
{"Аквамариновый Крайола", "78DBE2", "120, 219, 226"},
{"Ализариновый красный", "E32636", "227, 38, 54"},
}
Из-за лимита в 50к символов прикладываю отрывок из таблицы и файлом саму таблицу
Есть таблица цветов, как мне найти ближайший цвет в таблице к выдаваемому, к примеру, функцией.
Lua:
function getColorHex(color) -- sampGetPlayerColor или из хука сообщения
    local hex = bit.tohex(color)
    return string.sub(hex, 0, 6)
end
Или если в строке чата/диалога нашелся {......}
 

Вложения

  • color_tbl.lua
    66 KB · Просмотры: 8
Решение
ChatGPT, но вроде работать должно
Lua:
function findNearestColor(color)
    local minDistance = math.huge
    local nearestColor = nil

    for _, entry in ipairs(color_name) do
        local colorHex = entry[2]
        local r, g, b = tonumber(entry[3]:match("(%d+),")), tonumber(entry[3]:match("%s(%d+),")), tonumber(entry[3]:match("%s(%d+)"))
        
        local colorR = tonumber(color:sub(1, 2), 16)
        local colorG = tonumber(color:sub(3, 4), 16)
        local colorB = tonumber(color:sub(5, 6), 16)

        local distance = math.sqrt((colorR - r)^2 + (colorG - g)^2 + (colorB - b)^2)

        if distance < minDistance then
            minDistance = distance
            nearestColor = entry[1]
        end
    end

    return...

AugustTN

Известный
1,368
470
ChatGPT, но вроде работать должно
Lua:
function findNearestColor(color)
    local minDistance = math.huge
    local nearestColor = nil

    for _, entry in ipairs(color_name) do
        local colorHex = entry[2]
        local r, g, b = tonumber(entry[3]:match("(%d+),")), tonumber(entry[3]:match("%s(%d+),")), tonumber(entry[3]:match("%s(%d+)"))
        
        local colorR = tonumber(color:sub(1, 2), 16)
        local colorG = tonumber(color:sub(3, 4), 16)
        local colorB = tonumber(color:sub(5, 6), 16)

        local distance = math.sqrt((colorR - r)^2 + (colorG - g)^2 + (colorB - b)^2)

        if distance < minDistance then
            minDistance = distance
            nearestColor = entry[1]
        end
    end

    return nearestColor
end

function getColorHex(color)
    -- Ваш код для получения шестнадцатеричного значения цвета
end

-- Пример использования функции
local color = getColorHex(0xFF0000)  -- Получаем шестнадцатеричное значение цвета (в примере - красный)
local nearestColor = findNearestColor(color)  -- Находим ближайший цвет в таблице

print("Ближайший цвет:", nearestColor)
 

chapo

чопа сребдс // @moujeek
Модератор
8,868
11,575
Lua:
local RGB = {6, 8, 2}
local list = {
    {0, 0, 0},
    {10, 10, 10},
    {20, 20, 20},
    {30, 30, 30},
    {40, 40, 40},
    {50, 50, 50},
}

---@param mainColor {[1]: number, [2]: number, [3]: number}
---@param colors {[1]: number, [2]: number, [3]: number}[]
local function get(mainColor, colors)
    local result, minDiff = nil, 10000
    for index, color in ipairs(colors) do
        local diff = math.sqrt((mainColor[1] - color[1]) ^ 2 + (mainColor[2] - color[2]) ^ 2 + (mainColor[3] - color[3]) ^ 2)
        if diff < minDiff then
            result, minDiff = index, diff
        end
    end
    return result and colors[result] or mainColor
end

for k, v in ipairs(get(RGB, list)) do print(k, v) end
 
D

deleted-user-422095

Гость
Автор темы
Описание: Получить название цвета по RGB. Список названия цветов
Зависимость: explode_argb

Списки цветов:
https://pastebin.com/raw/tgw0DiJy (Из-за лимита)
Lua:
SHORT_ALL_NAME_COLORS = {
    { name = "Winter White", value = { 226, 227, 224 } },
    { name = "Mineral Red", value = { 134, 77, 88 } },
    { name = "Lilac Grey", value = { 163, 138, 141 } },
    { name = "Pastel Pink", value = { 239, 185, 192 } },
    { name = "Amaranth Blossom", value = { 123, 35, 49 } },
    { name = "Tin Pink", value = { 163, 137, 138 } },
    { name = "Blossom White", value = { 248, 232, 228 } },
    { name = "Maple Red", value = { 191, 81, 78 } },
    { name = "Antique White", value = { 238, 224, 220 } },
    { name = "China Red", value = { 173, 43, 16 } },
    { name = "Matte Grey", value = { 180, 168, 164 } },
    { name = "Granite Brown", value = { 61, 45, 36 } },
    { name = "Titian Red", value = { 189, 86, 32 } },
    { name = "Mango Orange", value = { 255, 139, 88 } },
    { name = "Moor Oak Grey", value = { 106, 88, 77 } },
    { name = "Maple Syrup Brown", value = { 200, 133, 84 } },
    { name = "Mild Orange", value = { 244, 186, 148 } },
    { name = "Saruk Grey", value = { 129, 114, 101 } },
    { name = "Golden Beige", value = { 206, 162, 119 } },
    { name = "Off White", value = { 237, 228, 217 } },
    { name = "Clay Ochre", value = { 174, 137, 93 } },
    { name = "Ash Yellow", value = { 240, 189, 126 } },
    { name = "Office Grey", value = { 99, 93, 84 } },
    { name = "Brass Yellow", value = { 181, 135, 53 } },
    { name = "Yellow Beige", value = { 227, 192, 141 } },
    { name = "Milk Star White", value = { 245, 237, 226 } },
    { name = "Feldspar Grey", value = { 188, 168, 133 } },
    { name = "Alabaster White", value = { 223, 212, 191 } },
    { name = "Aubergine Green", value = { 139, 118, 44 } },
    { name = "Champagne Beige", value = { 212, 196, 158 } },
    { name = "Cream Yellow", value = { 244, 227, 187 } },
    { name = "Cypress Green", value = { 158, 143, 87 } },
    { name = "Williams Pear Yellow", value = { 221, 199, 101 } },
    { name = "Night Green", value = { 48, 47, 39 } },
    { name = "Olivine Grey", value = { 146, 142, 124 } },
    { name = "Silver Green", value = { 210, 200, 140 } },
    { name = "Fog White", value = { 241, 239, 228 } },
    { name = "Indian Green", value = { 145, 149, 95 } },
    { name = "Lime Sorbet Green", value = { 198, 205, 125 } },
    { name = "Racing Green", value = { 65, 67, 58 } },
    { name = "Cider Pear Green", value = { 138, 148, 111 } },
    { name = "Jugendstil Green", value = { 195, 200, 179 } },
    { name = "Kelp Green", value = { 57, 72, 39 } },
    { name = "Soap Green", value = { 160, 178, 142 } },
    { name = "Spring Green", value = { 214, 233, 195 } },
    { name = "Silver Maple Green", value = { 113, 119, 110 } },
    { name = "Wormwood Green", value = { 159, 174, 158 } },
    { name = "Touch Of Green", value = { 219, 233, 213 } },
    { name = "Pointed Cabbage Green", value = { 133, 149, 135 } },
    { name = "Transparent White", value = { 203, 220, 203 } },
    { name = "Lemon Balm Green", value = { 0, 82, 40 } },
    { name = "Sports Field Green", value = { 77, 128, 100 } },
    { name = "Linoleum Green", value = { 58, 163, 114 } },
    { name = "Sun Yellow", value = { 171, 206, 186 } },
    { name = "Dark Green", value = { 40, 75, 62 } },
    { name = "Fuchsite Green", value = { 91, 126, 112 } },
    { name = "Sport Green", value = { 0, 162, 125 } },
    { name = "Crystal Glass Green", value = { 177, 226, 203 } },
    { name = "Pine Green", value = { 74, 99, 92 } },
    { name = "Industrial Turquoise", value = { 0, 138, 112 } },
    { name = "Glacial Green", value = { 111, 183, 168 } },
    { name = "Arctic White", value = { 229, 241, 236 } },
    { name = "Dark Turquoise", value = { 84, 126, 121 } },
    { name = "Jade Green", value = { 137, 179, 173 } },
    { name = "Concealed Green", value = { 38, 49, 48 } },
    { name = "Bath Green", value = { 10, 105, 106 } },
    { name = "Jugendstil Turquoise", value = { 95, 155, 156 } },
    { name = "Cold Air Turquoise", value = { 193, 220, 219 } },
    { name = "Cold Blue", value = { 0, 108, 120 } },
    { name = "Garish Blue", value = { 0, 164, 177 } },
    { name = "Antarctic Blue", value = { 204, 234, 231 } },
    { name = "Fjord Blue", value = { 0, 107, 125 } },
    { name = "Fischer Blue", value = { 50, 160, 177 } },
    { name = "Ice Shard Soft Blue", value = { 193, 222, 226 } },
    { name = "Ink Blue", value = { 0, 107, 136 } },
    { name = "Ice Gull Grey Blue", value = { 155, 178, 186 } },
    { name = "Crowberry Blue", value = { 0, 52, 71 } },
    { name = "Pure Light Blue", value = { 0, 106, 147 } },
    { name = "Clear Blue", value = { 0, 159, 200 } },
    { name = "Cosmos Blue", value = { 0, 50, 73 } },
    { name = "Linoleum Blue", value = { 66, 124, 157 } },
    { name = "Light Cyan", value = { 182, 202, 215 } },
    { name = "Opal Blue", value = { 0, 76, 115 } },
    { name = "Beijing Blue", value = { 62, 125, 170 } },
    { name = "Powder Soft Blue", value = { 185, 201, 215 } },
    { name = "Functional Blue", value = { 63, 96, 134 } },
    { name = "Butterfly Blue", value = { 95, 147, 204 } },
    { name = "Ambassador Blue", value = { 13, 47, 90 } },
    { name = "Neptune Blue", value = { 46, 93, 157 } },
    { name = "Organza Violet", value = { 115, 145, 204 } },
    { name = "Indigo Violet", value = { 36, 44, 82 } },
    { name = "Iris Blue", value = { 73, 88, 156 } },
    { name = "Wisteria Light Soft Blue", value = { 166, 168, 197 } },
    { name = "Mourning Violet", value = { 71, 67, 84 } },
    { name = "Hawk Grey", value = { 119, 117, 125 } },
    { name = "Morning Mist Grey", value = { 173, 167, 185 } },
    { name = "Crystal Purple", value = { 83, 61, 107 } },
    { name = "Orchid Mauve", value = { 134, 106, 170 } },
    { name = "Lava Black", value = { 53, 47, 54 } },
    { name = "Basil Mauve", value = { 108, 84, 114 } },
    { name = "Wonder Violet", value = { 160, 133, 166 } },
    { name = "Opulent Mauve", value = { 70, 35, 67 } },
    { name = "Sapphire Pink", value = { 136, 112, 132 } },
    { name = "Purple Pink", value = { 202, 158, 194 } },
    { name = "Dark Fig Violet", value = { 87, 59, 76 } },
    { name = "Port Wine Red", value = { 133, 112, 124 } },
    { name = "Mauve Grey", value = { 177, 167, 173 } },
    { name = "Mulled Wine Red", value = { 59, 41, 50 } },
    { name = "Dark Rose", value = { 135, 71, 102 } },
    { name = "Heather Violet", value = { 177, 131, 152 } },
    { name = "Orchid Rose", value = { 233, 209, 218 } },
    { name = "Ruby Grey", value = { 115, 82, 92 } },
    { name = "Cockscomb Red", value = { 188, 83, 120 } },
    { name = "Cake Frosting", value = { 249, 223, 229 } }
}
Lua:
SHORT_ALL_NAME_COLORS = {
    { name = "Зимний белый", value = { 226, 227, 224 } },
    { name = "Красный минерал", value = { 134, 77, 88 } },
    { name = "Сиренево-серый", value = { 163, 138, 141 } },
    { name = "Пастельно-розовый", value = { 239, 185, 192 } },
    { name = "Цветок амаранта", value = { 123, 35, 49 } },
    { name = "Оловянно-розовый", value = { 163, 137, 138 } },
    { name = "Цветок белый", value = { 248, 232, 228 } },
    { name = "Красный клен", value = { 191, 81, 78 } },
    { name = "Античный белый", value = { 238, 224, 220 } },
    { name = "Китайский красный", value = { 173, 43, 16 } },
    { name = "Матово-серый", value = { 180, 168, 164 } },
    { name = "Гранит коричневый", value = { 61, 45, 36 } },
    { name = "Тицианово-красный", value = { 189, 86, 32 } },
    { name = "Манго-апельсин", value = { 255, 139, 88 } },
    { name = "Болотный дуб серый", value = { 106, 88, 77 } },
    { name = "Коричневый кленовый сироп", value = { 200, 133, 84 } },
    { name = "Мягкий апельсин", value = { 244, 186, 148 } },
    { name = "Золотисто-бежевый", value = { 206, 162, 119 } },
    { name = "Не совсем белый", value = { 237, 228, 217 } },
    { name = "Глиняная охра", value = { 174, 137, 93 } },
    { name = "Пепельно-желтый", value = { 240, 189, 126 } },
    { name = "Офисный серый", value = { 99, 93, 84 } },
    { name = "Латунно-желтый", value = { 181, 135, 53 } },
    { name = "Желто-бежевый", value = { 227, 192, 141 } },
    { name = "Молочно-звездный белый", value = { 245, 237, 226 } },
    { name = "Серый полевой шпат", value = { 188, 168, 133 } },
    { name = "Алебастр белый", value = { 223, 212, 191 } },
    { name = "Баклажанно-зеленый", value = { 139, 118, 44 } },
    { name = "Бежевый цвет шампанского", value = { 212, 196, 158 } },
    { name = "Кремово-желтый", value = { 244, 227, 187 } },
    { name = "Зеленый кипарис", value = { 158, 143, 87 } },
    { name = "Желтая груша", value = { 221, 199, 101 } },
    { name = "Ночная зелень", value = { 48, 47, 39 } },
    { name = "Оливиново-серый", value = { 146, 142, 124 } },
    { name = "Серебристо-зеленый", value = { 210, 200, 140 } },
    { name = "Белый туман", value = { 241, 239, 228 } },
    { name = "Индеец Зеленый", value = { 145, 149, 95 } },
    { name = "Лаймовый сорбет зеленый", value = { 198, 205, 125 } },
    { name = "Гоночный зеленый", value = { 65, 67, 58 } },
    { name = "Сидр грушевый зеленый", value = { 138, 148, 111 } },
    { name = "Зеленый югендстиль", value = { 195, 200, 179 } },
    { name = "Ламинария зеленая", value = { 57, 72, 39 } },
    { name = "Зеленое мыло", value = { 160, 178, 142 } },
    { name = "Весенняя зелень", value = { 214, 233, 195 } },
    { name = "Серебристо-зеленый клен", value = { 113, 119, 110 } },
    { name = "Полынь зеленая", value = { 159, 174, 158 } },
    { name = "Прикосновение зеленого", value = { 219, 233, 213 } },
    { name = "Остроконечная капуста зеленая", value = { 133, 149, 135 } },
    { name = "Прозрачный белый", value = { 203, 220, 203 } },
    { name = "Мелисса лимонная Зеленый", value = { 0, 82, 40 } },
    { name = "Зеленая спортивная площадка", value = { 77, 128, 100 } },
    { name = "Зеленый линолеум", value = { 58, 163, 114 } },
    { name = "Солнечно-желтый", value = { 171, 206, 186 } },
    { name = "Темно-зеленый", value = { 40, 75, 62 } },
    { name = "Фукситово-зеленый", value = { 91, 126, 112 } },
    { name = "Спортивный зеленый", value = { 0, 162, 125 } },
    { name = "Кристалльное стекло зеленое", value = { 177, 226, 203 } },
    { name = "Сосново-зеленый", value = { 74, 99, 92 } },
    { name = "Промышленная бирюза", value = { 0, 138, 112 } },
    { name = "Ледниково-зеленый", value = { 111, 183, 168 } },
    { name = "Арктический белый", value = { 229, 241, 236 } },
    { name = "Темно-бирюзовый", value = { 84, 126, 121 } },
    { name = "Нефритово-зеленый", value = { 137, 179, 173 } },
    { name = "Скрытый зеленый", value = { 38, 49, 48 } },
    { name = "Зеленая ванна", value = { 10, 105, 106 } },
    { name = "Бирюзовый", value = { 95, 155, 156 } },
    { name = "Холодный бирюзовый воздух", value = { 193, 220, 219 } },
    { name = "Холодный синий", value = { 0, 108, 120 } },
    { name = "Ярко-синий", value = { 0, 164, 177 } },
    { name = "Антарктический голубой", value = { 204, 234, 231 } },
    { name = "Голубой фьорд", value = { 0, 107, 125 } },
    { name = "Ледяной осколок нежно-голубого", value = { 193, 222, 226 } },
    { name = "Синие чернила", value = { 0, 107, 136 } },
    { name = "Ледяная чайка серо-голубого", value = { 155, 178, 186 } },
    { name = "Голубая вороника", value = { 0, 52, 71 } },
    { name = "Чистый светло-голубой", value = { 0, 106, 147 } },
    { name = "Чистый синий", value = { 0, 159, 200 } },
    { name = "Космически синий", value = { 0, 50, 73 } },
    { name = "Линолеум голубой", value = { 66, 124, 157 } },
    { name = "Светло-голубой", value = { 182, 202, 215 } },
    { name = "Опалово-голубой", value = { 0, 76, 115 } },
    { name = "Пекинский синий", value = { 62, 125, 170 } },
    { name = "Пудра нежно-голубого цвета", value = { 185, 201, 215 } },
    { name = "Функциональный синий", value = { 63, 96, 134 } },
    { name = "Голубая бабочка", value = { 95, 147, 204 } },
    { name = "Нептун Синий", value = { 46, 93, 157 } },
    { name = "Органза фиолетовая", value = { 115, 145, 204 } },
    { name = "Индиго-фиолетовый", value = { 36, 44, 82 } },
    { name = "Ирис голубой", value = { 73, 88, 156 } },
    { name = "Глициния светло-нежно-голубая", value = { 166, 168, 197 } },
    { name = "Траурная фиалка", value = { 71, 67, 84 } },
    { name = "Серый ястреб", value = { 119, 117, 125 } },
    { name = "Серый утренний туман", value = { 173, 167, 185 } },
    { name = "Кристально-фиолетовый", value = { 83, 61, 107 } },
    { name = "Сиреневая орхидея", value = { 134, 106, 170 } },
    { name = "Лава черная", value = { 53, 47, 54 } },
    { name = "Базилик лиловый", value = { 108, 84, 114 } },
    { name = "Чудо-фиалка", value = { 160, 133, 166 } },
    { name = "Роскошный лиловый", value = { 70, 35, 67 } },
    { name = "Сапфирово-розовый", value = { 136, 112, 132 } },
    { name = "Пурпурно-розовый", value = { 202, 158, 194 } },
    { name = "Темно-фиалковый инжир", value = { 87, 59, 76 } },
    { name = "Портвейн красный", value = { 133, 112, 124 } },
    { name = "Сиренево-серый", value = { 177, 167, 173 } },
    { name = "Глинтвейн красный", value = { 59, 41, 50 } },
    { name = "Темная роза", value = { 135, 71, 102 } },
    { name = "Вересковая фиалка", value = { 177, 131, 152 } },
    { name = "Орхидейная роза", value = { 233, 209, 218 } },
    { name = "Рубиново-серый", value = { 115, 82, 92 } },
    { name = "Глазурь для торта", value = { 249, 223, 229 } }
}
Укороченный вариант в ~16 раз меньше. Возможно подберете наилучшие варианты (можете предлагать), мне лень это было делать.
Код:
Lua:
function getNameColorARGB(argb, arrColors)
    local ma, mr, mg, mb = explode_argb(argb)

    local function getSim(rgb)
        local r, g, b = table.unpack(rgb)
        return math.sqrt((r - mr)^2 + (g - mg)^2 + (b - mb)^2)
    end

    local res = { }
    for k, v in ipairs(arrColors) do
        local sum = getSim(v.value)

        if res[sum] == nil then
            table.insert(res, { sum = sum, name = v.name })
        end
    end
    table.sort(res, function(a, b) return a.sum < b.sum end)
    return res[1].name
end
Lua:
function getNameColorARGB(argb, arrColors)
    local ma, mr, mg, mb = explode_argb(argb)

    local function getSimAlternative(rgb) -- https://stackoverflow.com/questions/2103368/color-logic-algorithm
        local rr, gg, bb = table.unpack(rgb)

        local rmean = (mr + rr) * 0.5
        local r = mr - rr
        local g = mg - gg
        local b = mb - bb

        return math.sqrt( bit.rshift(((512 + rmean)*r*r), 8) + 4*g*g + bit.rshift(((767 - rmean)*b*b), 8) )
    end

    local res = { }
    for k, v in ipairs(arrColors) do
        local sum = getSimAlternative(v.value)

        if res[sum] == nil then
            table.insert(res, { sum = sum, name = v.name })
        end
    end
    table.sort(res, function(a, b) return a.sum < b.sum end)
    return res[1].name
end

Пример использования:
First:
function getNameColorARGB(argb)
    local ma, mr, mg, mb = explode_argb(argb)

    local function getSim(rgb)
        local r, g, b = table.unpack(rgb)
        return math.sqrt((r - mr)^2 + (g - mg)^2 + (b - mb)^2)
    end

    local res = { }
    for k, v in ipairs(SHORT_ALL_NAME_COLORS) do
        local sum = getSim(v.value)

        if res[sum] == nil then
            table.insert(res, { sum = sum, name = v.name })
        end
    end
    table.sort(res, function(a, b) return a.sum < b.sum end)
    return res[1].name
end

print(getNameColorARGB(0xFF552211)) -- Output: Гранит коричневый
Second:
-- imgui
-- cfg.menu.color = 0xFFB6940B
imgui.Hint("##CUSTOM_STYLE_MENU", u8(string.format("Цвет: Свой [%s]", getNameColorARGB(cfg.menu.color))))

-- Functions
function getNameColorARGB(argb)
    local ma, mr, mg, mb = explode_argb(argb)

    local function getSim(rgb)
        local r, g, b = table.unpack(rgb)
        return math.sqrt((r - mr)^2 + (g - mg)^2 + (b - mb)^2)
    end

    local res = { }
    for k, v in ipairs(SHORT_ALL_NAME_COLORS) do
        local sum = getSim(v.value)

        if res[sum] == nil then
            table.insert(res, { sum = sum, name = v.name })
        end
    end
    table.sort(res, function(a, b) return a.sum < b.sum end)
    return res[1].name
end
Посмотреть вложение 208356
Не считаю чем-то уникальным, но пусть будет как ещё одна альтернатива