![]() |
Усредненный цвет области изображения
Подскажите, пожалуйста, как получить некое среднее значение цвета в Битмапдате или загруженном изображении?
Т.е, например, есть у меня изображение, и я хочу рамку для него перекрашивать в цвет подходящий для этой фотки. Может кто алгоритмом поможет, может есть уже готовое решение. |
Можно посчитать именно среднее - сложить RGB-значения всех точек в заданной области и поделить на количество точек. До этого можно уменьшить изображение с интерполяцией во временный буфер, чтобы перебирать меньше точек.
|
Можно использовать метод
Код AS3:
Нахождение контрастного цвета - отнимаем от 0xFFFFFF(белый цвет) найденное значение (в нашем случае 0xAABBCC), итоговый цвет - контрастный (у нас он равен 0x554433). Добавлено через 4 минуты http://f.imagehost.org/0373/Colors.png |
вот что у меня получилось методом "тупого" нахождения средних значений цветовых компонент
Код AS3:
Может есть более гармоничный (в плане результирующего цвета) алгоритм? С histogram() идея понятна, но это все таки под 10-ку, пока не очень хочется на нее ориентироваться.... |
Попробуйте всё-же уменьшать изображение перед циклом, а также не перебирать точки в центре изображения (только края некоторой ширины).
|
Можно рисовать битмап в другой, который в 2 раза меньше, потом полученный битмап опять рисовать в уменьшенный в два раза, и т.д. пока не получишь изображение в 1 пиксел =)
|
А можно вообще уменьшить до 1 пикселя и взять его цвет :)
|
>>и т.д. пока не получишь изображение в 1 пиксел =)
а чего не сразу-то Код AS3:
|
mre, silin не, так не сработает, надо постепенно в два раза уменьшать :)
Кстати, в играх так расчитывается средняя освещенность сцены, когда используется HDR с адаптацией Вобще, этот метод имеет смысл использовать если рисование картинки происходит при помощи видяхи, а не процессора. Вроде как в 9 и 10 плеере хардварное рисование, поэтому пусть ГПУ сам считает средний цвет =) |
Цитата:
|
_dm, не понятно тебя: в чем нюанс, что значит "не сработает" ?, у меня почему-то работает
причем тут хардварное рисование тоже не совсем ясно, нативный draw по-любому будет быстрее скриптового счета, а реализуется он программно или на видеокарте - вопрос десятый |
Не сработает, потому что при уменьшении не усредняются значения всех точек.
|
>>Не сработает, потому что при уменьшении не усредняются значения всех точек.
ага, а только некоторых :) возможно и не усредняются в прямом смысле, на глаз это выглядит именно так |
>>_dm, не понятно тебя: в чем нюанс, что значит "не сработает" ?, у меня почему-то работает
Если честно, я не пробовал рисовать сразу в один пиксель, просто если уменьшать в 2 раза, так будут усреднятся именно соседние пиксели, а если сразу в надцать раз уменьшить - некоторые точки не будут учтены... но если точность не важна, то можно сразу рисовать в 1 пиксель =) З.Ы. погуглил о хардварном ускорении - в адобовском блоге написано "Starting in version 9.0.115.0, the Flash Player was able to display _fullscreen_ content with GPU assistance."... эх, а я думал оно и в окне ускоряет :( |
Как я и предлагал, вот пример работы с гистограммой.
Класс "подборщика" цвета: Код AS3:
Код AS3:
пример: http://g.imagehost.org/0553/contrast.jpg |
Всем спасибо.
Метод silin'a тоже выдает не всегда приемлемые результаты (видимо это похоже просто на случайный выбор цвета одного пикселя), например на вечерних фотках, цвет всегда почти черный. Метод serenkiy с хистограммой, наверное, самый правильный, но он под 10 плеер, "мне ща так низя" :) Поэтому решил все таки искать средний цвет перебором чуток уменьшенного изображения. Либо найти 4-8 средних цветов изображения и из них уже выбрать случайно один. Вот еще осталось непонятно как сделать цвет чуть-чуть темнее? Т.е не накладывать его с прозрачностью на темный фон или сверху него класть прозрачный темный фон, а именно сам цвет (т.е значение сделать темнее). |
станет потемнее :)
Код AS3:
|
Ну, раз используется 9я версия, переписал класс для 9й версии:
Код AS3:
|
serenkiy, спасибо за класс, пригодится ;)
Вообщем методом проб и ошибок пришел к выводу, что наилучшим является метод с вычислением среднего значения цвета всех точек, а метод гистограмм чаще него выдает результат не подходящий к фотке. Метод silin'a берет некий цвет прямо из центральной точки фотки (остальные не учитываются), наверное этот способ равносилен просто выборке цвета этой точки :). Всем спасибо. Цитата:
Но как же все таки сделать цвет потемнее? Наверное BlooDHounD имел ввиду что то типа такого: Код AS3:
|
Надо умножить значения RGB на число от 0 до 1 (1 полная яркость).
|
Вот что по итогу получилось, может кому пригодится
Код AS3:
|
Mur4ik, правильно правильно. забыл обратно преобразовать.
|
| Часовой пояс GMT +4, время: 23:16. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.