Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Общие вопросы о Flash (не затрагивающие ActionScript) (http://www.flasher.ru/forum/forumdisplay.php?f=60)
-   -   Критерий "похожести" цветов в цифровом формате (http://www.flasher.ru/forum/showthread.php?t=87080)

miramax 28.10.2006 06:24

Критерий "похожести" цветов в цифровом формате
 
Дано:
массив colours с цветами (0x55ff55, 0xaadd55, 0x884545, 0xFFFF00 .... );
любой цвет myColour (например 0x00аа00)
Найти:
цвет в массива colours самый близкий (визуально наиболее похожий) на цвет myColour.

Условие "самый близкий" я вижу как наибольшую вероятность не различить эти цвета глазом.
Разбиение uint на значения каналов и сравнение этих значений наводят меня на печальные мысли :(
Что же взять за критерий "похожести" цветов в цифровом формате?

iNils 28.10.2006 06:30

А почему на печальные мысли наводит?

miramax 28.10.2006 06:37

Например цвет 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)


iNils 28.10.2006 06:54

Для начала переводить цвета в HSB, так как эта модель самая близкая к восприятию человека.

miramax 28.10.2006 06:59

Отлично, сэнкс за наводку. :)
Вот нашёл, __etc написал полезную штуку на эту тему:
http://dev.etcs.ru/blog/as2/ru/etcs/draw/colorobject/

udaaff 28.10.2006 08:25

выделить канал можно следующим способом
Код:

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);


miramax 28.10.2006 08:39

Цитата:

Сообщение от udaaff
выделить канал можно следующим способом

Выделить канал не проблема,
Я не понял твоей коснтрукции. Делаю вот так
Код:

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. Результаты более правдоподобные

udaaff 28.10.2006 09:23

Цитата:

Сообщение от miramax
Выделить канал не проблема,
Я не понял твоей коснтрукции.

На каждый канал отводится по 8 бит(на цвет RGB-24)
R.делаем сдвиг на 16(биты которые выходят за рамки убиваются), остается красный
G.--сдвиг на 8 (восемь убиваются)
----оставлям побитовым "&" нужные 8
B.оставляем "&" нужные 8

iNils 28.10.2006 09:40

2 miramax: Твоя функция в 25 раз медленнее работает и самое главное в некоторых случаев она будет работать не правильно (например если был задан цвет 0x00FFFF или 0x055555).
2 udaaff: я не понял смысла операции color >> 0

etc 28.10.2006 12:52

miramax, цвет строкой должен быть задан, numberToHEX у меня в классе возвращает строку, которая потом уже разбивается на подстроки.

Переделаю пару функций в ColorObject, чтобы быстрее работало…

UPD: можешь обновиться, я там как раз переделал на битовое сравнение.


Часовой пояс GMT +4, время: 14:56.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.