|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
ветеран форума
|
Усредненный цвет области изображения
Подскажите, пожалуйста, как получить некое среднее значение цвета в Битмапдате или загруженном изображении?
Т.е, например, есть у меня изображение, и я хочу рамку для него перекрашивать в цвет подходящий для этой фотки. Может кто алгоритмом поможет, может есть уже готовое решение.
__________________
trace("Остановите Землю, я сойду!!!"); |
|
|||||
Регистрация: Feb 2009
Сообщений: 1,195
|
Можно посчитать именно среднее - сложить RGB-значения всех точек в заданной области и поделить на количество точек. До этого можно уменьшить изображение с интерполяцией во временный буфер, чтобы перебирать меньше точек.
|
|
|||||
Можно использовать метод
у BitmapData. Он представляет распространение отдельных значений цветовых компонентов изображения (красный, зеленый, синий, альфа). Исходя из гистограммы, находим наиболее распространенное значение компонента (например, красный - AA, зеленый - BB, синий - CC...альфа не трогаем). Совмещаем шестнадцатеричные значения и получаем усредненный цвет - 0xAABBCC. Далее или используем его, или находим его контрастный цвет. Нахождение контрастного цвета - отнимаем от 0xFFFFFF(белый цвет) найденное значение (в нашем случае 0xAABBCC), итоговый цвет - контрастный (у нас он равен 0x554433). Добавлено через 4 минуты Последний раз редактировалось serenkiy; 03.04.2009 в 04:52. |
|
|||||
ветеран форума
|
вот что у меня получилось методом "тупого" нахождения средних значений цветовых компонент
public function findFrameColour( $source:BitmapData ):uint { var r:Number = 0; var g:Number = 0; var b:Number = 0; var pCount:Number = $source.width * $source.height; var pixel:Number; for (var px:int = 0; px < $source.width; px++) { for (var py:int = 0; py < $source.height; py++) { pixel = $source.getPixel(px, py); r += pixel >> 16 & 0xFF; g += pixel >> 8 & 0xFF; b += pixel & 0xFF; } } r /= pCount; g /= pCount; b /= pCount; return r << 16 | g << 8 | b; } Может есть более гармоничный (в плане результирующего цвета) алгоритм? С histogram() идея понятна, но это все таки под 10-ку, пока не очень хочется на нее ориентироваться....
__________________
trace("Остановите Землю, я сойду!!!"); Последний раз редактировалось Mur4ik; 03.04.2009 в 07:44. |
|
|||||
Регистрация: Feb 2009
Сообщений: 1,195
|
Попробуйте всё-же уменьшать изображение перед циклом, а также не перебирать точки в центре изображения (только края некоторой ширины).
|
|
|||||
Регистрация: Feb 2009
Сообщений: 23
|
Можно рисовать битмап в другой, который в 2 раза меньше, потом полученный битмап опять рисовать в уменьшенный в два раза, и т.д. пока не получишь изображение в 1 пиксел =)
|
|
|||||
>>и т.д. пока не получишь изображение в 1 пиксел =)
а чего не сразу-то |
|
|||||
Регистрация: Feb 2009
Сообщений: 23
|
mre, silin не, так не сработает, надо постепенно в два раза уменьшать
Кстати, в играх так расчитывается средняя освещенность сцены, когда используется HDR с адаптацией Вобще, этот метод имеет смысл использовать если рисование картинки происходит при помощи видяхи, а не процессора. Вроде как в 9 и 10 плеере хардварное рисование, поэтому пусть ГПУ сам считает средний цвет =) Последний раз редактировалось _dm; 03.04.2009 в 14:51. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
«Вроде как», но действительности не соответствует.
|
Часовой пояс GMT +4, время: 22:07. |
|
« Предыдущая тема | Следующая тема » |
|
|