【发布时间】:2010-07-13 00:20:52
【问题描述】:
我想要一个基色,比如 0x0066FF,并且我希望之后的每次迭代都变得稍微暗一些。
【问题讨论】:
-
排序重复,这里有很多相关的答案:stackoverflow.com/questions/2258800/…
标签: actionscript-3 colors
我想要一个基色,比如 0x0066FF,并且我希望之后的每次迭代都变得稍微暗一些。
【问题讨论】:
标签: actionscript-3 colors
除了您的输入颜色是某种灰色阴影外,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);
【讨论】:
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;
}
【讨论】:
0x00 00 00 是红绿蓝。含义 0xFF0000 是纯红色,0x00FF00 是纯绿色,0x0000FF 是纯蓝色。因此,如果您想变暗,请从 0xFF 开始降低十六进制值。如果您希望从 0x0066FF 缩放黑暗,则需要确保保持相同的 RGB 比率。含义 0xFF00FF -> 0xCC00CC -> 0x990099 -> 0x660066 -> 0x330033 -> 0x000000。
请原谅部分答案,但希望这足以让您自己找出更具体的实现细节。
【讨论】: