Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   связь параметров setTransform() с реальными значениями hue/saturation/contrast (http://www.flasher.ru/forum/showthread.php?t=92273)

: hr : 20.02.2007 18:05

связь параметров setTransform() с реальными значениями hue/saturation/contrast
 
Господа гуру, вопрос к Вам :) Существуют ли формулы связи параметров метода Color.setTransform() с понятными человеческому мозгу значениями hue/saturation/contrast?
О чем я говорю? В восьмом флэше у нас есть flash.filters.ColorMatrixFilter. И это, насколько я понимаю, переработанный Color.setTransform(). Так вот есть в природе инструменты (например ru.etcs.filters.ColorFilter http://dev.etcs.ru/blog/as2/ru/etcs/...s/colorfilter/), которые позволяют просто менять значения цветовых характеристик, без мороки с матрицей. Нет сил разбирать класс Гранта Скиннера... А хочется перевести такой мехнизм через Color.setTransform(), чтобы юзать в 6/7 - подвинул ползунок hue, и тебе изменился оттенок... :)

etc 20.02.2007 18:24

Ну некоторую имитацию hue сделать возможно, используя всякие ra, ba и т.п.
А вот с saturation, боюсь, ничего не выйдет.

Яркость, реализованная через setTransform заметно отличается от таковой при использовании фильтров.

Double 21.02.2007 08:34

я, должно быть, старый маразматик, но функция hls2rgb (hls мне больше, чем hsb нравится. хотя различия непринципиальны. про hsc - "hue/saturation/contrast" я до сих пор не слышал. это какое-то новое цветовое пространство ;) ) или обратная ей занимает 20 строк кода (не люблю я аттачить к ролику пушку для стрельбы по воробьям). ну а т.к. трансформ неодноцветных объектов в любом случае непредсказуем, трансформить надо одноцвет, поверх которого отрисованы тени и блики.
хотя я может быть и не о том? юзерский интерфейс надо вменяемый реализовать?

Dendroid 21.02.2007 10:10

Есть очень хороший класс от Mario Klingemann. Я его использовала вот в таком упрощённом, адаптированном виде:
Код:

// ColorMatrix Class v1.2
//
// Author: Mario Klingemann
// http://www.quasimondo.com

package {

import flash.filters.ColorMatrixFilter;

public class ColorMatrix
{
       
        // RGB to Luminance conversion constants as found on
        // Charles A. Poynton's colorspace-faq:
        // http://www.faqs.org/faqs/graphics/colorspace-faq/
       
        private static var r_lum:Number = 0.212671;
        private static var g_lum:Number = 0.715160;
        private static var b_lum:Number = 0.072169;
       
        /*
       
        // There seem  different standards for converting RGB
        // values to Luminance. This is the one by Paul Haeberli:
       
        private static var r_lum:Number = 0.3086;
        private static var g_lum:Number = 0.6094;
        private static var b_lum:Number = 0.0820;
       
        */
       
        private static var IDENTITY:Array =      [1,0,0,0,0,
                                                                                          0,1,0,0,0,
                                                                                          0,0,1,0,0,
                                                                                          0,0,0,1,0];
       
        public var matrix:Array;
       
       
        /*
  Function: ColorMatrix
 
          Constructor

  Parameters:

      mat - if omitted matrix gets initialized with an
                        identity matrix. Alternatively it can be
                        initialized with another ColorMatrix or
                        an array (there is currently no check
                        if the array is valid. A correct array
                        contains 20 elements.)
                       
                       
        */

       
        public function ColorMatrix ( mat:Object=null )
        {
                if (mat instanceof ColorMatrix )
                {
                        matrix = mat.matrix.concat();
                } else if (mat instanceof Array )
                {
                        matrix = mat.concat();
                } else
                {
                        reset();
                }
               
        }
       
        /*
  Function: reset

          resets the matrix to the neutral identity matrix. Applying this
          matrix to an image will not make any changes to it.

  Parameters:

      none
         
        Returns:
       
                nothing
                       
                       
        */
       
        public function reset()
        {
                matrix = IDENTITY.concat();
        }
       
       
        public function clone():ColorMatrix
        {
                return new ColorMatrix( matrix );
        }
       
       
       
        public function adjustSaturation ( s:Number )
        {
                var s1:Number=1-s;
               
            var irlum:Number = s1 * r_lum;
                var iglum:Number = s1 * g_lum;
                var iblum:Number = s1 * b_lum;
               
                var mat:Array =        [irlum + s, iglum    , iblum    , 0, 0,
                                                                  irlum    , iglum + s, iblum    , 0, 0,
                                                            irlum    , iglum    , iblum + s, 0, 0,
                                                            0        , 0        , 0        , 1, 0 ];
       
               
                concat(mat);
        }
       
        public function adjustContrast ( r:Number, g:Number, b:Number )
        {
                g = g || r;
                b = b || r;
               
                r+=1;
                g+=1;
                b+=1;
               
                var mat:Array =      [r,0,0,0,128*(1-r),
                                                            0,g,0,0,128*(1-g),
                                                            0,0,b,0,128*(1-b),
                                                          0,0,0,1,0];
       
               
                concat(mat);
        }
       
        public function adjustBrightness (r:Number, g:Number, b:Number)
        {
                g = g || r;
                b = b || r;
               
                var mat:Array =      [1,0,0,0,r,
                                                            0,1,0,0,g ,
                                                            0,0,1,0,b ,
                                                          0,0,0,1,0 ];
       
               
                concat(mat);
               
        }
       
        public function adjustHue( angle:Number )
        {
                        angle *= Math.PI/180;
                       
                        var c:Number = Math.cos( angle );
            var s:Number = Math.sin( angle );
                       
            var f1:Number = 0.213;
            var f2:Number = 0.715;
            var f3:Number = 0.072;
                       
            var mat:Array = [(f1 + (c * (1 - f1))) + (s * (-f1)), (f2 + (c * (-f2))) + (s * (-f2)), (f3 + (c * (-f3))) + (s * (1 - f3)), 0, 0, (f1 + (c * (-f1))) + (s * 0.143), (f2 + (c * (1 - f2))) + (s * 0.14), (f3 + (c * (-f3))) + (s * -0.283), 0, 0, (f1 + (c * (-f1))) + (s * (-(1 - f1))), (f2 + (c * (-f2))) + (s * f2), (f3 + (c * (1 - f3))) + (s * f3), 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1];
                       
                        concat(mat);
        }
       
        public function colorize ( rgb:Number, amount:Number)
        {
               
                var r:Number = ( ( rgb >> 16 ) & 0xff ) / 255;
                var g:Number = ( ( rgb >> 8  ) & 0xff ) / 255;
                var b:Number = (  rgb        & 0xff ) / 255;
               
                amount = amount||1;
                var inv_amount:Number = 1 - amount;
               
               
                var mat:Array =        [ inv_amount + amount*r*r_lum, amount*r*g_lum,  amount*r*b_lum, 0, 0,
                                                                  amount*g*r_lum, inv_amount + amount*g*g_lum, amount*g*b_lum, 0, 0,
                                                                    amount*b*r_lum,amount*b*g_lum, inv_amount + amount*b*b_lum, 0, 0,
                                                            0 , 0 , 0 , 1, 0 ];
               
               
                concat(mat);
        }
       
       
        public function concat(mat:Array)
        {
               
                var temp:Array = [];
                var i:Number = 0;
               
                for (var y:Number = 0; y < 4; y++ )
                {
                       
                        for (var x:Number = 0; x < 5; x++ )
                        {
                                temp[i + x] = mat[i    ] * matrix[x    ] +
                                                          mat[i+1] * matrix[x +  5] +
                                                          mat[i+2] * matrix[x + 10] +
                                                          mat[i+3] * matrix[x + 15] +
                                                          (x == 4 ? mat[i+4] : 0);
                        }
                        i+=5;
                }
               
                matrix = temp;
               
        }
       
        public function get filter():ColorMatrixFilter
        {
                return new ColorMatrixFilter( matrix );
        }

       
}
}

пользоваться очень просто:
Код:

                var colorMatrix:ColorMatrix = new ColorMatrix();
                if (hue) {
                        colorMatrix.adjustHue(hue*180);
                }
                if (saturation) {
                        colorMatrix.adjustSaturation(saturation+1);
                }
                if (brightness) {
                        colorMatrix.adjustBrightness(255*brightness, 255*brightness, 255*brightness);
                }
                if (contrast) {
                        colorMatrix.adjustContrast(contrast, contrast, contrast);
                }
                movie.filters = [colorMatrix.filter];

Нулевые значения - оригинальные цвета.
"saturation=-1" - черно-белый вариант.
"saturation=-2" - инверсия цвета.

: hr : 21.02.2007 13:39

Код:

import flash.filters.ColorMatrixFilter;
Dendroid, речь о 6/7 плэйере, я же говорил

Цитата:

ну а т.к. трансформ неодноцветных объектов в любом случае непредсказуем, трансформить надо одноцвет, поверх которого отрисованы тени и блики.
хм.. интересная мысль... а почему нельзя трансформить неодноцвет? при наличии тех же ч/б составляющих (тени/блики) и изменении hue - они просто не будут затронуты. В фотошопе и с помощью ColorMatrixFilter это прекрасно работает. Или я не прав?

Цитата:

Ну некоторую имитацию hue сделать возможно, используя всякие ra, ba и т.п.
А вот с saturation, боюсь, ничего не выйдет.

Яркость, реализованная через setTransform заметно отличается от таковой при использовании фильтров.
__etc, т.е. разница в реализации фильтров и setTransform все же есть... ясно.. setTransform'ом не получится..

vic_ 21.02.2007 15:41

Цитата:

Сообщение от : hr :
хм.. интересная мысль... а почему нельзя трансформить неодноцвет? при наличии тех же ч/б составляющих (тени/блики) и изменении hue - они просто не будут затронуты. В фотошопе и с помощью ColorMatrixFilter это прекрасно работает. Или я не прав?

речь идет о 6-7 плейере, ты же говорил

: hr : 21.02.2007 16:05

vic_, так в том то и дело, чтобы
Цитата:

трансформить неодноцвет
в 6/7 плэйере... имитированием ColorMatrixFilter через setTransform().

vic_ 21.02.2007 16:34

Я понял чего вы хотите. Без работы с BitmapData, а это появилось только в плейере 8, это сделать невозможно. До восьмой версии плейеру абсолютно безразлично, какой цвет имеет тот или другой пиксел обьекта.

: hr : 21.02.2007 17:30

Цитата:

Я понял чего вы хотите.
не уверен...

etc 21.02.2007 17:46

vic_, причем тут BitmapData? Речь шла о реализации фильтра типа ColorFilter, но только средствами setTransform.


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

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