Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Усредненный цвет области изображения (http://www.flasher.ru/forum/showthread.php?t=123478)

Mur4ik 03.04.2009 01:56

Усредненный цвет области изображения
 
Подскажите, пожалуйста, как получить некое среднее значение цвета в Битмапдате или загруженном изображении?

Т.е, например, есть у меня изображение, и я хочу рамку для него перекрашивать в цвет подходящий для этой фотки.

Может кто алгоритмом поможет, может есть уже готовое решение.

VVall 03.04.2009 02:06

Можно посчитать именно среднее - сложить RGB-значения всех точек в заданной области и поделить на количество точек. До этого можно уменьшить изображение с интерполяцией во временный буфер, чтобы перебирать меньше точек.

serenkiy 03.04.2009 03:55

Можно использовать метод
Код AS3:

public function histogram(hRect:Rectangle = null):Vector.<Vector>

у BitmapData. Он представляет распространение отдельных значений цветовых компонентов изображения (красный, зеленый, синий, альфа). Исходя из гистограммы, находим наиболее распространенное значение компонента (например, красный - AA, зеленый - BB, синий - CC...альфа не трогаем). Совмещаем шестнадцатеричные значения и получаем усредненный цвет - 0xAABBCC. Далее или используем его, или находим его контрастный цвет.
Нахождение контрастного цвета - отнимаем от 0xFFFFFF(белый цвет) найденное значение (в нашем случае 0xAABBCC), итоговый цвет - контрастный (у нас он равен 0x554433).

Добавлено через 4 минуты
http://f.imagehost.org/0373/Colors.png

Mur4ik 03.04.2009 07:32

вот что у меня получилось методом "тупого" нахождения средних значений цветовых компонент
Код AS3:

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-ку, пока не очень хочется на нее ориентироваться....

VVall 03.04.2009 07:49

Попробуйте всё-же уменьшать изображение перед циклом, а также не перебирать точки в центре изображения (только края некоторой ширины).

_dm 03.04.2009 13:51

Можно рисовать битмап в другой, который в 2 раза меньше, потом полученный битмап опять рисовать в уменьшенный в два раза, и т.д. пока не получишь изображение в 1 пиксел =)

mre 03.04.2009 14:37

А можно вообще уменьшить до 1 пикселя и взять его цвет :)

silin 03.04.2009 14:46

>>и т.д. пока не получишь изображение в 1 пиксел =)
а чего не сразу-то
Код AS3:

public function findFrameColour( source:BitmapData ):uint
{
        var mtrx:Matrix = new Matrix();
        mtrx.scale(1 / source.width, 1 / source.height);
        var resBmd:BitmapData = new BitmapData(1, 1);
        resBmd.draw(source, mtrx);
        var res:uint = resBmd.getPixel(0, 0);
        resBmd.dispose();
        return res;
}


_dm 03.04.2009 14:47

mre, silin не, так не сработает, надо постепенно в два раза уменьшать :)
Кстати, в играх так расчитывается средняя освещенность сцены, когда используется HDR с адаптацией

Вобще, этот метод имеет смысл использовать если рисование картинки происходит при помощи видяхи, а не процессора. Вроде как в 9 и 10 плеере хардварное рисование, поэтому пусть ГПУ сам считает средний цвет =)

etc 03.04.2009 14:53

Цитата:

Сообщение от _dm (Сообщение 810542)
Вроде как в 9 и 10 плеере хардварное рисование

«Вроде как», но действительности не соответствует.


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

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