【问题标题】:How do I change hexidecimal colours programmatically to get lighter or darker?如何以编程方式更改十六进制颜色以变得更亮或更暗?
【发布时间】:2010-07-13 00:20:52
【问题描述】:

我想要一个基色,比如 0x0066FF,并且我希望之后的每次迭代都变得稍微暗一些。

【问题讨论】:

标签: actionscript-3 colors


【解决方案1】:

除了您的输入颜色是某种灰色阴影外,RGB 不会削减它。 RGB 对于存储像素数据很有用,但以“视觉上”有意义的方式操作起来很糟糕。

前段时间,我在 Flash 编码员列表上写了一个类似的答案,关于这个主题,所以接下来的内容或多或少是该答案的逐字复制和粘贴。我希望你觉得它有用。

更改基色阴影的准确方法是将 RGB 值转换为 HSL color space,然后调整亮度(亮度),然后再转换回 RGB。 这是一个用于转换 RGB HLS 的便捷类。

http://www.dreaminginflash.com/2007/11/19/hls-to-rgb-rgb-to-hls/

这是一些测试代码:

import ColorUtils;
var rgb:Number = 0x336699;
var hls:Object = ColorUtils.RGBtoHLS(rgb);
var darkL:Number  = Math.max(hls.l - 0.2,0);
var lightL:Number  = Math.min(hls.l + 0.2,1);
var dark:Number = ColorUtils.HLStoRGB(hls.h,darkL,hls.s);
var light:Number = ColorUtils.HLStoRGB(hls.h,lightL,hls.s);
var origBmd:BitmapData   = new BitmapData(40,40,false,rgb);
var darkerBmd:BitmapData = new BitmapData(40,40,false,dark);
var lighterBmd:BitmapData = new BitmapData(40,40,false,light);
var origBm:Bitmap = new Bitmap(origBmd);
var darkerBm:Bitmap = new Bitmap(darkerBmd);
var lighterBm:Bitmap = new Bitmap(lighterBmd);

darkerBm.y  = 0;
origBm.y  = 50;
lighterBm.y = 100;

addChild(origBm);
addChild(darkerBm);
addChild(lighterBm);

【讨论】:

    【解决方案2】:

    0x000000 是黑色的,所以任何接近黑色的东西都更暗(或者更灰,无论如何)。因此,如果你将每个字节的差异拆分为自身和 0x00 之间,它会快速变暗。

    0x00 / 2 = 0x00
    0x66 / 2 = 0x33
    0xff / 2 = 0x80
    
    --> 0x0033ff
    

    例如,如果您想要 10 种色调,您可以将其分成 10 份并迭代删除 1/10。

    更新:

    这是我不久前写的:

        /**
         * Create new color blended into another.
         * @param color to blend
         * @param into other color
         * @param factor amount of original color to keep, i.e. 0 would be no "color", all "into"
         * @param blendAlpha uses the 0xFF000000 part of the color as well
                 * @returns blended color uint
         */
        public static function blendColor( color:uint, into:uint=0xFFFFFFFF, factor:Number=0.5, blendAlpha:Boolean=false ) : uint
        {
            if( factor < 0 || factor > 1 ) factor = 0.5;
            var a1:uint = ( color >> 24 ) & 0xFF;
            var r1:uint = ( color >> 16 ) & 0xFF;
            var g1:uint = ( color >>  8 ) & 0xFF;
            var b1:uint = ( color >>  0 ) & 0xFF;
            var a2:uint = (  into >> 24 ) & 0xFF;
            var r2:uint = (  into >> 16 ) & 0xFF;
            var g2:uint = (  into >>  8 ) & 0xFF;
            var b2:uint = (  into >>  0 ) & 0xFF;
            var a3:uint = ( a1*factor + a2*(1-factor) ) & 0xFF;
            var r3:uint = ( r1*factor + r2*(1-factor) ) & 0xFF;
            var g3:uint = ( g1*factor + g2*(1-factor) ) & 0xFF;
            var b3:uint = ( b1*factor + b2*(1-factor) ) & 0xFF;
            return ( blendAlpha?a3<<24:0x0 ) | (r3<<16) | (g3<<8) | b3;
        }
    

    【讨论】:

    • 如何使用动态颜色输入实际编程?
    • 请注意,尽管您的代码是正确的,但单独缩放 RGB 组件不会产生相同颜色/色调的不同阴影(好吧,灰色除外)。
    • @juan:是的,我知道,它基本上只是给它添加了灰色,并且它偏向黑色或白色。但它很快,是按位处理 rgb 值的一个很好的例子。为了在效果期间使位图变暗,我一直无法区分这与更精确的颜色方法之间的区别。话虽这么说,如果我对照片进行静态更改,我不会使用它 - 然后颜色会看起来不适合人眼,我会假设......
    • 同意。要为过渡添加效果,这种方法可能会很好。
    【解决方案3】:

    0x00 00 00 是红绿蓝。含义 0xFF0000 是纯红色,0x00FF00 是纯绿色,0x0000FF 是纯蓝色。因此,如果您想变暗,请从 0xFF 开始降低十六进制值。如果您希望从 0x0066FF 缩放黑暗,则需要确保保持相同的 RGB 比率。含义 0xFF00FF -> 0xCC00CC -> 0x990099 -> 0x660066 -> 0x330033 -> 0x000000。

    请原谅部分答案,但希望这足以让您自己找出更具体的实现细节。

    【讨论】:

    • 底色是动态的,有什么通用的公式可以用吗?
    猜你喜欢
    • 2018-12-23
    • 2020-02-10
    • 2018-05-06
    • 2010-12-19
    • 2016-08-06
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多