在 ActionScript 3 中创建高光和阴影
Create highlight and shadow in ActionScript 3
有谁知道如何在 ActionScript 3 中基于一种颜色创建两种新颜色(高光和阴影)?那么,如果我有红色 (0xFF0000),我也会得到浅红色和深红色吗?
我不知道。谢谢!
要获得 Highlight(亮度),您需要将每个 R、G 和 B 均等地增加相同的量(最大值为 255
或 0xFF
)。在您的情况下,红色已经达到最大值,因此将绿色和蓝色增加相同的量(eg 在每个通道上执行 += 128
)。
要获得 Shadow(黑暗),您需要将每个 R、G 和 B 均等地减少相同的量(最小值为 0
或 0x00
)。在你的情况下,绿色和蓝色都已经处于最小值,所以只需将红色减少 x 量(eg 做一个 -= 128
红色通道)。
简而言之:
输入 = 0xFF0000
... 然后高亮 = 0xFF8080
和阴影 = 0x800000
.
更新:
关于 highlight/shadow 其他颜色(或色调)案例的评论提出了一个很好的观点。如果我们同意“更亮”意味着添加更多白色,“更暗”意味着添加更多黑色,那么线性插值可能会对您有所帮助(基本上使输入颜色渐变为黑色或白色并选择您喜欢的 darker/lighter沿这些 A-to-B 路径着色...
PS:通过插值,您可以灵活地混合 lightness/darkness 的不同色调和阴影。也许从明亮的红色混合到更暗的 reddish-purple(而不只是黑色)以获得“更甜美”的阴影颜色,并且您的绿色可以有黄色亮点(而不仅仅是白色)。蓝色由你决定。
用法示例:
var newColour :uint = 0;
newColour = blendRGB_AS3 (0xFF0000, 0xFFFFFF, 0.5) //# get 50% white added
newColour = blendRGB_AS3 (0xFF0000, 0x000000, 0.5) //# get 50% black added
示例函数:
(注意:(temp_int >> 0)
在这里用作任何分数结果的快速 Math.Floor
)
//# function inputs: src_C, dest_C, stopPoint ... where:
//# src_C = source / start colour A (as 0xRGB)
//# dest_C = destination / end colour B (as 0xRGB)
//# stopPoint = A-to-B stopping point (as ranging from 0.0 to 1.0)
function blendRGB_AS3 (src_C, dest_C, stopPoint ) :uint
{
//# using Unsigned INTegers since no need of the minus ( - ) sign.
var temp_int :uint = 0; var res_C :uint = 0;
var src_R :uint = (src_C >> 16 & 0xFF);
var src_G :uint = (src_C >> 8 & 0xFF);
var src_B :uint = (src_C >> 0 & 0xFF);
var dst_R :uint = (dest_C >> 16 & 0xFF);
var dst_G :uint = (dest_C >> 8 & 0xFF);
var dst_B :uint = (dest_C >> 0 & 0xFF);
//# Now for each R, G, B Channel...
//# calculate the mid-point value then merge that into output of "res_C"
//# for Red
temp_int = src_R + stopPoint * (dst_R - src_R);
res_C = ( (temp_int >> 0) << 16);
//# for Green
temp_int = src_G + stopPoint * (dst_G - src_G);
res_C |= ( (temp_int >> 0) << 8);
//# for Blue
temp_int = src_B + stopPoint * (dst_B - src_B);
res_C |= ( (temp_int >> 0) << 0);
return res_C; //# gives: example 0xFF0000 if red
}
有谁知道如何在 ActionScript 3 中基于一种颜色创建两种新颜色(高光和阴影)?那么,如果我有红色 (0xFF0000),我也会得到浅红色和深红色吗?
我不知道。谢谢!
要获得 Highlight(亮度),您需要将每个 R、G 和 B 均等地增加相同的量(最大值为 255
或 0xFF
)。在您的情况下,红色已经达到最大值,因此将绿色和蓝色增加相同的量(eg 在每个通道上执行 += 128
)。
要获得 Shadow(黑暗),您需要将每个 R、G 和 B 均等地减少相同的量(最小值为 0
或 0x00
)。在你的情况下,绿色和蓝色都已经处于最小值,所以只需将红色减少 x 量(eg 做一个 -= 128
红色通道)。
简而言之:
输入 = 0xFF0000
... 然后高亮 = 0xFF8080
和阴影 = 0x800000
.
更新:
关于 highlight/shadow 其他颜色(或色调)案例的评论提出了一个很好的观点。如果我们同意“更亮”意味着添加更多白色,“更暗”意味着添加更多黑色,那么线性插值可能会对您有所帮助(基本上使输入颜色渐变为黑色或白色并选择您喜欢的 darker/lighter沿这些 A-to-B 路径着色...
PS:通过插值,您可以灵活地混合 lightness/darkness 的不同色调和阴影。也许从明亮的红色混合到更暗的 reddish-purple(而不只是黑色)以获得“更甜美”的阴影颜色,并且您的绿色可以有黄色亮点(而不仅仅是白色)。蓝色由你决定。
用法示例:
var newColour :uint = 0;
newColour = blendRGB_AS3 (0xFF0000, 0xFFFFFF, 0.5) //# get 50% white added
newColour = blendRGB_AS3 (0xFF0000, 0x000000, 0.5) //# get 50% black added
示例函数:
(注意:(temp_int >> 0)
在这里用作任何分数结果的快速 Math.Floor
)
//# function inputs: src_C, dest_C, stopPoint ... where:
//# src_C = source / start colour A (as 0xRGB)
//# dest_C = destination / end colour B (as 0xRGB)
//# stopPoint = A-to-B stopping point (as ranging from 0.0 to 1.0)
function blendRGB_AS3 (src_C, dest_C, stopPoint ) :uint
{
//# using Unsigned INTegers since no need of the minus ( - ) sign.
var temp_int :uint = 0; var res_C :uint = 0;
var src_R :uint = (src_C >> 16 & 0xFF);
var src_G :uint = (src_C >> 8 & 0xFF);
var src_B :uint = (src_C >> 0 & 0xFF);
var dst_R :uint = (dest_C >> 16 & 0xFF);
var dst_G :uint = (dest_C >> 8 & 0xFF);
var dst_B :uint = (dest_C >> 0 & 0xFF);
//# Now for each R, G, B Channel...
//# calculate the mid-point value then merge that into output of "res_C"
//# for Red
temp_int = src_R + stopPoint * (dst_R - src_R);
res_C = ( (temp_int >> 0) << 16);
//# for Green
temp_int = src_G + stopPoint * (dst_G - src_G);
res_C |= ( (temp_int >> 0) << 8);
//# for Blue
temp_int = src_B + stopPoint * (dst_B - src_B);
res_C |= ( (temp_int >> 0) << 0);
return res_C; //# gives: example 0xFF0000 if red
}