经典论坛's Archiver

xxxicx 发表于 2006-7-10 17:44

请教高手,关于色相,饱和度,亮度,对比度

其实就是falsh里面“调整颜色”滤镜的功能,只是我想在falsh里面实现,让用户可以自己来调节色相,饱和度,亮度,对比度

不知道rgba的值应该怎样变化才能实现?:confused:

flash帮助文档里面只给出了一个很简单的示例,如下所示:


下面的示例使用 BitmapFilter 来根据鼠标指针的位置操作图像的颜色饱和度。如果将鼠标指针置于左上角 (0,0),图像应保持不变。随着鼠标指针的右移,绿色通道和蓝色通道一起从图像中删除。随着鼠标指针的下移,红色通道被删除。如果将鼠标指针置于舞台的右下方,图像应完全变黑。此示例假设您的库中具有链接标识符设置为"YourImageLinkage"的图像。

import flash.filters.BitmapFilter;
import flash.filters.ColorMatrixFilter;

var image:MovieClip = this.attachMovie("YourImageLinkage", "YourImage", this.getNextHighestDepth());
image.cacheAsBitmap = true;

var listener:object = new Object();
listener.image = image;
listener.onMouseMove = function() {
    var xPercent:Number = 1 - (_xmouse/Stage.width);
    var yPercent:Number = 1 - (_ymouse/Stage.height);
    var matrix:Array = new Array();
    matrix = matrix.concat([yPercent, 0, 0, 0, 0]); // red
    matrix = matrix.concat([0, xPercent, 0, 0, 0]); // green
    matrix = matrix.concat([0, 0, xPercent, 0, 0]); // blue
    matrix = matrix.concat([0, 0, 0, 1, 0]); // alpha

    var filter:BitmapFilter = new ColorMatrixFilter(matrix);
    image.filters = new Array(filter);
}

Mouse.addListener(listener);
listener.onMouseMove();


请问要调节色相,饱和度,亮度,对比度,rgba的值应该如何变化??望高手可以解答,相关资料吗?

[[i] 本帖最后由 HBrO 于 2006-9-21 14:53 编辑 [/i]]

xxxicx 发表于 2006-7-11 11:11

顶,希望高手指点一下

xxxicx 发表于 2006-7-11 12:21

在顶,期待高手解答

xxxicx 发表于 2006-7-12 11:16

up

meud 发表于 2006-7-20 13:52

色相,饱和度的RGB转换需要一套固定的公式,你可以GOOGLE一下,记得网上有开源的作品的……

FlashK 发表于 2006-7-20 15:22

不太清楚,还以为flash8直接支持了,这东东有用啊

[[i] 本帖最后由 FlashK 于 2006-7-20 15:24 编辑 [/i]]

OneNature 发表于 2006-7-20 16:10

自己摸索了一下, 好像是这样子的. ..
0xFFFFFF -> c.r=255; c.g=255; c.b=255
function hex2RGB(hex) {
        var c:Object = {r:0, g:0, b:0};
        hex = hex.toString(16);
        while (hex.length<6) {
                hex = "0"+hex;
        }
        c.r = Number("0x"+hex.substr(0, 2));
        c.g = Number("0x"+hex.substr(2, 2));
        c.b = Number("0x"+hex.substr(4, 2));
        return c;
}
function RGB2Hex(rgb) {
        var h = new Object();
        h.r = rgb.r.toString(16).length<2 ? "0"+rgb.r.toString(16) : rgb.r.toString(16);
        h.g = rgb.g.toString(16).length<2 ? "0"+rgb.g.toString(16) : rgb.g.toString(16);
        h.b = rgb.b.toString(16).length<2 ? "0"+rgb.b.toString(16) : rgb.b.toString(16);
        return "0x"+h.r+h.g+h.b;
}

不知道正统的算法是怎样地~~~~哈, 先跟个帖炒起来..

[[i] 本帖最后由 OneNature 于 2006-7-20 16:17 编辑 [/i]]

haxe 发表于 2006-7-20 16:45

Color类

Color类(AS3):(改写自Robert Penner的Color类)
package {
        import flash.display.Sprite ;
      import flash.geom.ColorTransform;
        public class Color {
                public static function setRGB(mc:Sprite,col:uint):void{
                        var color:ColorTransform=new ColorTransform() ;
                        color.color=col ;
                        mc.transform.colorTransform=color ;
                        }
                public static function getRGB(mc:Sprite):uint{
                        return mc.transform.colorTransform.color ;
                        }
            public static function getRGBstr(mc:Sprite):String{
                        var hexStr:String=mc.transform.colorTransform.color.toString(16);
                        //trace("hex ="+hexStr);
                        var toFill:int =6-hexStr.length ;
                        while(toFill--){ hexStr="0"+hexStr; }
                        hexStr="0x"+hexStr ;
                        return hexStr ;
                        }
                //        r= -255 ~ 255 .
                               public static function setRGB2(mc:Sprite,r:uint,g:uint,b:uint):void {
                        var c:uint= (r << 16 | g << 8 | b ) ;
                        setRGB(mc,c);
                        }
                public static function getRGB2(mc:Sprite):Object {
                        var c:ColorTransform= mc.transform.colorTransform ;
                        return { r:c.redOffset,g:c.greenOffset,b:c.blueOffset } ;
                        }
                public static function reset(mc:Sprite ):void {
                        mc.transform.colorTransform= new ColorTransform();
                        }
                public static function setBrightness(mc:Sprite,bright:uint):void{
                        var trans:ColorTransform=mc.transform.colorTransform ;
                        with(trans){
                        redMultiplier=greenMultiplier=blueMultiplier=(100-Math.abs(bright))/100 ;
                        redOffset=greenOffset=blueOffset=(bright > 0 ) ? bright*(256/100) : 0 ;
                                }
                        mc.transform.colorTransform=trans ;
                        }
                //offset = -255~ 255 .
                public static function setBrightOffset(mc:Sprite,offset:uint):void{
                        var trans:ColorTransform=mc.transform.colorTransform ;
                        with(trans){
                                redOffset=greenOffset=blueOffset=offset ;
                                }
                        mc.transform.colorTransform=trans ;
                        }
                public static function setTint(mc:Sprite,r:uint,g:uint,b:uint,percent:uint):void{
                        var per:Number=percent/100 ;
                        var trans:ColorTransform=mc.transform.colorTransform ;
                        with(trans){
                                redOffset   = per*redOffset ;
                                greenOffset = per*greenOffset ;
                                blueOffset  = per*blueOffset ;
                                redMultiplier=greenMultiplier=blueMultiplier=(100-percent)/100 ;
                                }
                        mc.transform.colorTransform=trans ;
                        }
                public static function getTint(mc:Sprite):Object {
                        var trans:ColorTransform=mc.transform.colorTransform ;
                        var tint:Object=new Object() ;
                        tint.percent=(1-trans.redMultiplier )*100;
                        var per:Number=100/tint.percent ;
                        tint.r       = Math.round(per*trans.redOffset) ;
                        tint.g       = Math.round(per*trans.greenOffset) ;
                        tint.b       = Math.round(per*trans.blueOffset) ;
                        return tint ;
                        }
                public static function setTintOffset(mc:Sprite,r:uint,g:uint,b:uint):void{
                        var trans:ColorTransform=mc.transform.colorTransform ;
                        with(trans){
                                redOffset   = r ;
                                greenOffset = g ;
                                blueOffset  = b ;
                                }
                        mc.transform.colorTransform=trans ;
                        }
                public static function getTintOffset(mc:Sprite):Object {
                        var trans:ColorTransform=mc.transform.colorTransform ;
                        var tint:Object=new Object() ;
                        tint.rb       = trans.redOffset;
                        tint.gb       = trans.greenOffset ;
                        tint.bb       = trans.blueOffset ;
                        return tint ;
                        }
                public static function invert(mc:Sprite):void{
                        var trans:ColorTransform=mc.transform.colorTransform ;
                        with(trans){
                                redMultiplier   = -redMultiplier ;
                                greenMultiplier = -greenMultiplier ;
                                blueMultiplier  = -blueMultiplier ;
                                redOffset       = 255-redOffset ;
                                greenOffset     = 255-greenOffset;
                                blueOffset      = 255-blueOffset;
                                }
                        mc.transform.colorTransform=trans ;
                        }
                //percent=0~100
                public static function setNegative(mc:Sprite,percent:Number):void{
                        var trans:ColorTransform=mc.transform.colorTransform ;
                        with(trans){
                        redMultiplier   = greenMultiplier = blueMultiplier  =(100-2*percent)/100;
                        redOffset       = greenOffset     = blueOffset      =percent*(255/100);
                                }
                        mc.transform.colorTransform=trans ;
                        }
                public static function getNegative(mc:Sprite):Number{
                        var trans:ColorTransform=mc.transform.colorTransform ;
                        return trans.redOffset*(100/255) ;
                        }
                public static function setRed(mc:Sprite,r:uint):void{
                        var t:ColorTransform=mc.transform.colorTransform ;
                        var c:uint= ( r << 16 | t.greenOffset << 8 | t.blueOffset );
                        setRGB(mc,c);
                        }
                public static function setGreen(mc:Sprite,r:uint):void{
                        var t:ColorTransform=mc.transform.colorTransform ;
                        var c:uint= ( t.redOffset << 16 | r << 8 | t.blueOffset );
                        setRGB(mc,c);
                        }
                public static function setBlue(mc:Sprite,r:uint):void{
                        var t:ColorTransform=mc.transform.colorTransform ;
                        var c:uint= ( t.redOffset << 16  | t.greenOffset << 8 | r );
                        setRGB(mc,c);
                        }
                public static function getRed(mc:Sprite):uint{
                        return  mc.transform.colorTransform.redOffset;
                        }
            public static function getGreen(mc:Sprite):uint{
                        return  mc.transform.colorTransform.greenOffset;
                }
            public static function getBlue(mc:Sprite):uint{
                        return  mc.transform.colorTransform.blueOffset;
                        }
                }
}

[[i] 本帖最后由 haxe 于 2006-7-20 17:32 编辑 [/i]]

mirycat 发表于 2006-7-20 16:54

标准的做法, 使用位操作
[html]
Color.HEXtoRGB = function(hex) {
        var rgb24 = (isNaN(hex)) ? parseInt(hex, 16) : hex;
        var r = rgb24 >> 16;
        var g = (rgb24 ^ (r << 16)) >> 8;
        var b = (rgb24 ^ (r << 16)) ^ (g << 8);
        return {r:r, g:g, b:b};
}
[/html]

haxe 发表于 2006-7-20 16:55

ColorMatrix类

改写自:www.quasimondo.com

[list]
package {
public class ColorMatrix
{
        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 INIT:Array =new 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 ( ...arguments )
        {
                if (arguments.length==1)
                {
                        matrix = arguments[0].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():void
        {
                matrix = INIT.concat();
        }
        //设置饱和度(-3 - 3 )
        /*
   Function: adjustSaturation

          changes the saturation

   Parameters:

      s - typical values come in the range 0.0 ... 2.0 where
                                 0.0 means 0% Saturation
                                 0.5 means 50% Saturation
                                 1.0 is 100% Saturation (aka no change)
                                 2.0 is 200% Saturation

                                 Other values outside of this range are possible
                                 -1.0 will invert the hue but keep the luminance
        Returns:

                nothing


        */
        public function setSaturation ( s:Number ):void
        {
                var lis:Number=1-s;

              var irlum:Number = lis * r_lum;
                var iglum:Number = lis * g_lum;
                var iblum:Number = lis * b_lum;

                var mat:Array = new 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);
        }
        //设置对比度(-2 - 5)
        public function setContrast (...arguments):void
        {
                var mat:Array;
                if(arguments.length==1){
                        var r:Number=arguments[0] ;
                  r+=1 ;
                       mat=new  Array(r,0,0,0,128*(1-r),
                                             0,r,0,0,128*(1-r),
                                             0,0,r,0,128*(1-r),
                                             0,0,0,1,0);
                }else if(arguments.length==3){
                        var r1:Number=arguments[0];
                        var g:Number=arguments[1];
                        var b:Number=arguments[2];
                                 mat =new  Array(r1,0,0,0,128*(1-r1),
                                             0,g,0,0,128*(1-g),
                                             0,0,b,0,128*(1-b),
                                             0,0,0,1,0);
                        }
                concat(mat);
        }
        //设置亮度(0-255)
        public function setBrightness (...arguments):void
        {
                var mat:Array;
                if(arguments.length==1){
                        var r:Number=arguments[0] ;

                       mat= new Array(  1,0,0,0, r,
                                              0,1,0,0, r,
                                                0,0,1,0, r,
                                                0,0,0,1, 0    );
                }else if(arguments.length==3){
                                mat= new Array(  1,0,0,0, arguments[0],
                                                   0,1,0,0, arguments[1],
                                                     0,0,1,0, arguments[2],
                                                     0,0,0,1, 0    );
                        }
                concat(mat);
        }
        //设置反转效果(0-360)
        public function setHue( rot:Number ):void
        {
                rot*=Math.PI/180;
                var c:Number = Math.cos(rot);
            var s:Number = Math.sin(rot);
            var f1:Number = 0.213;
            var f2:Number = 0.715;
            var f3:Number = 0.072;
            var mat:Array = new 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);
        }
      //设置透明度(0-1)
        public function setAlpha( alpha:Number ):void
        {
                var mat:Array = new  Array ( 1, 0, 0, 0, 0,
                                                     0, 1, 0, 0, 0,
                                                     0, 0, 1, 0, 0,
                                                     0, 0, 0, alpha, 0 );

                concat(mat);
        }
      //变成黑白图片
        public function desaturate():void
        {
                var mat:Array = new Array ( r_lum, g_lum, b_lum, 0, 0,
                                                    r_lum, g_lum, b_lum, 0, 0,
                                                    r_lum, g_lum, b_lum, 0, 0,
                                                    0    , 0    , 0    , 1, 0 );

                concat(mat);
        }
        //颜色反转
        public function invert():void
        {
                var mat:Array = new Array ( -1 ,  0,  0, 0, 255,
                                                    0 , -1,  0, 0, 255,
                                                    0 ,  0, -1, 0, 255,
                                                    0 ,  0,  0, 1,   0);

                concat(mat);
        }
        //负片效果
        public function threshold( t:Number ):void
        {
                var mat:Array = new Array  (        r_lum*256, g_lum*256, b_lum*256, 0,  -256*t,
                                                        r_lum*256 ,g_lum*256, b_lum*256, 0,  -256*t,
                                                        r_lum*256, g_lum*256, b_lum*256, 0,  -256*t,
                                                        0, 0, 0, 1, 0 );
                concat(mat);
        }

        //设置颜色通道
        public function setChannels (r:Number, g:Number, b:Number, a:Number ):void
        {
                var rf:Number =((r & 1) == 1 ? 1:0) + ((r & 2) == 2 ? 1:0) + ((r & 4) == 4 ? 1:0) + ((r & 8) == 8 ? 1:0);
                if (rf>0) rf=1/rf;
                var gf:Number =((g & 1) == 1 ? 1:0) + ((g & 2) == 2 ? 1:0) + ((g & 4) == 4 ? 1:0) + ((g & 8) == 8 ? 1:0);
                if (gf>0) gf=1/gf;
                var bf:Number =((b & 1) == 1 ? 1:0) + ((b & 2) == 2 ? 1:0) + ((b & 4) == 4 ? 1:0) + ((b & 8) == 8 ? 1:0);
                if (bf>0) bf=1/bf;
                var af:Number =((a & 1) == 1 ? 1:0) + ((a & 2) == 2 ? 1:0) + ((a & 4) == 4 ? 1:0) + ((a & 8) == 8 ? 1:0);
                if (af>0) af=1/af;

                var mat:Array =new   Array((r & 1) == 1 ? rf:0,(r & 2) == 2 ? rf:0,(r & 4) == 4 ? rf:0,(r & 8) == 8 ? rf:0,0,
                                                   (g & 1) == 1 ? gf:0,(g & 2) == 2 ? gf:0,(g & 4) == 4 ? gf:0,(g & 8) == 8 ? gf:0,0,
                                                   (b & 1) == 1 ? bf:0,(b & 2) == 2 ? bf:0,(b & 4) == 4 ? bf:0,(b & 8) == 8 ? bf:0,0,
                                                   (a & 1) == 1 ? af:0,(a & 2) == 2 ? af:0,(a & 4) == 4 ? af:0,(a & 8) == 8 ? af:0,0);

                concat(mat);

        }
        public function concat(mat:Array):Array
        {
                var temp:Array =new  Array ();
                var i:int = 0;

                for (var y:int = 0; y < 4; y++ )
                {
                        for (var x:int = 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;
                return temp ;
        }
  }
}
[/list]

[[i] 本帖最后由 haxe 于 2006-7-20 17:20 编辑 [/i]]

mirycat 发表于 2006-7-20 16:58

[quote]原帖由 [i]haxe[/i] 于 2006-7-20 04:45 PM 发表
Color类:(改写自Robert Penner的Color类)
package {
        import flash.display.Sprite ;
      import flash.geom.ColorTransform;
        public class Color {
                public static function setRGB(mc:Sprite,col:u ... [/quote]

我说你没必要把 as3 的东西拿出来吧? 人家是在问 as2 的
除非你想让人家知道你这个类功能如何如何, 并且是用 as3 写的 :o:o

haxe 发表于 2006-7-20 17:05

我这边没有AS2的。

mirycat 发表于 2006-7-20 17:21

要么改一下给他... 否则给也是白给啊.....

haxe 发表于 2006-7-20 17:23

这也是...,我找找。

sersky 发表于 2006-9-21 03:09

晕了 我也是想要达到这种效果啊 完整的做法怎么做啊??谢了哈

HBrO 发表于 2006-9-21 14:49

强,还真的拿公式算了出来.

pyfxl 发表于 2008-1-11 17:28

顶一下,谢谢。

WBBS 发表于 2008-1-15 21:26

看一下PS帮助就知道个大概了.

页: [1]



Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.