Просмотр полной версии : Критерий "похожести" цветов в цифровом формате
Дано:
массив colours с цветами (0x55ff55, 0xaadd55, 0x884545, 0xFFFF00 .... );
любой цвет myColour (например 0x00аа00)
Найти:
цвет в массива colours самый близкий (визуально наиболее похожий) на цвет myColour.
Условие "самый близкий" я вижу как наибольшую вероятность не различить эти цвета глазом.
Разбиение uint на значения каналов и сравнение этих значений наводят меня на печальные мысли :(
Что же взять за критерий "похожести" цветов в цифровом формате?
А почему на печальные мысли наводит?
Например цвет 888888 визуально ближе к aaaaaa чем к aa88aa, а если сравнивать каналы то получим что цвет 888888 ближе к aa88aa... как их правильно сравнить-то?
graphics.lineStyle(0, 0x000000, 0)
graphics.beginFill(0x888888)
graphics.drawRect(0, 0, 300, 50)
graphics.beginFill(0xaaaaaa)
graphics.drawRect(0, 50, 300, 50)
graphics.beginFill(0xaa88aa)
graphics.drawRect(0, 100, 300, 50)
Для начала переводить цвета в HSB, так как эта модель самая близкая к восприятию человека.
Отлично, сэнкс за наводку. :)
Вот нашёл, __etc написал полезную штуку на эту тему:
http://dev.etcs.ru/blog/as2/ru/etcs/draw/colorobject/
выделить канал можно следующим способом
function RGB(color:Number) {
var R:Number = (color >> 16)
var G:Number = (color >> 8) & 0xFF;
var B:Number = (color >> 0) & 0xFF;
trace("Red " + R.toString(16));
trace("Green " + G.toString(16));
trace("Blue " + B.toString(16));
}
RGB(0xAB12CF);
выделить канал можно следующим способом
Выделить канал не проблема,
Я не понял твоей коснтрукции. Делаю вот так
var color:Number = 0xe4dddf;
R = Number('0x'+color.toString(16).substr(0, 2))
G = Number('0x'+color.toString(16).substr(2, 2))
B = Number('0x'+color.toString(16).substr(4, 2))
но с каналами всё равно не подходит вариант, нужно сравнивать параметры HSB. Результаты более правдоподобные
Выделить канал не проблема,
Я не понял твоей коснтрукции.
На каждый канал отводится по 8 бит(на цвет RGB-24)
R.делаем сдвиг на 16(биты которые выходят за рамки убиваются), остается красный
G.--сдвиг на 8 (восемь убиваются)
----оставлям побитовым "&" нужные 8
B.оставляем "&" нужные 8
2 miramax: Твоя функция в 25 раз медленнее работает и самое главное в некоторых случаев она будет работать не правильно (например если был задан цвет 0x00FFFF или 0x055555).
2 udaaff: я не понял смысла операции color >> 0
miramax, цвет строкой должен быть задан, numberToHEX у меня в классе возвращает строку, которая потом уже разбивается на подстроки.
Переделаю пару функций в ColorObject, чтобы быстрее работало…
UPD: можешь обновиться, я там как раз переделал на битовое сравнение.
2 udaaff: я не понял смысла операции color >> 0
в ней столько же смысла , сколько и в A+0
http://algolist.manual.ru/graphics/find_col.php :)
Это ты столько времени искал?:)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.