gpt4 book ai didi

actionscript-3 - 在 AS3 中将 alpha 百分比转换为 RGBA 十六进制?

转载 作者:行者123 更新时间:2023-12-04 06:41:12 29 4
gpt4 key购买 nike

假设我的 AS 代码中有以下设置:

var color:String = "#0000FF"; //blue
var alpha:Number = 42; //42% or 42/100

我如何将它们组合成 #RRGGBBAA 十六进制颜色?我一直在谷歌上搜索并试图找出十六进制转换和表示法,但运气不佳。

最佳答案

有两种方法可以做到这一点。一种是使用 int 的 toString() 方法并将 16 作为基数/基数传递:

var rgb:int = (int)("#0000FF".replace("#","0x"));//convert the string to a int (note you can type hex ints starting with 0x (e.g. 0x0000FF)
var a:int = 42;
var rgba:int = int("0x"+rgb.toString(16) + a.toString(16));

或使用 bitwise operators 的不那么复杂且计算速度可能更快的方法:

var rgb:uint = (uint)("#0000FF".replace("#","0x"));
//extract components using bit shifting (>>) and masking (0xFF)
var r:uint = rgb >> 16 & 0xFF;
var g:uint = rgb >> 8 & 0xFF;
var b:uint = rgb >> 0 & 0xFF;//same as rgb >> 0xFF, just added >> 0 to make the shift obvious
var a:uint = 42;
var rgba:uint = r << 24 | g << 16 | b << 8 | a;
var argb:uint = a << 24 | r << 16 | g << 8 | b;
//test
trace(rgba.toString(16));
trace(argb.toString(16));

请注意,在上面的跟踪中使用 toString(16) 是为了让它对我们人类有用,使用十六进制颜色值时,您将使用实际的 uint 值。

另请注意,有时您可能希望在 as3 中使用 ARGB,例如在使用 BitmapData 时:

addChild(new BitmapData(100,100,true,0x2a0000ff));//add a 42% transparent blue box (100x100 px)

更新

上面的 bitshift 代码片段实际上详细解释了 rgb 提取,这有助于更好地理解事情,但是你已经有了 rgb,所以这是添加 alpha 组件的问题。你还提到了 42%,这与 0 到 255 的比例不同。因此,下面是您的答案:

var rgb:uint = (uint)("#0000FF".replace("#","0x"));
var a:uint = (uint)((42 * .01) * 255);//map 42 from 0<>100 to 0<>255 ( *.01 is the same as / 100 but faster
var rgba:uint = rgb << 8 | a;
var argb:uint = a << 24 | rgb;

关于速度,如果我将两种不同的转换方法运行一百万次,这里是执行时间:

using strings (var rgba:int = int("0x"+rgb.toString(16) + a.toString(16));) takes 851 ms 
using bitwise ops (var rgba:uint = rgb << 8| a;) takes 3 ms

正如您所见,按位版本比字符串版本要快得多,而且对于您的情况来说甚至更简洁。此外,既然您了解了按位运算符,那么阅读/理解起来可能会更容易。

总结:

var color:String = "#0000FF"; //blue
var alpha:Number = 42; //42% or 42/100
var rgb:uint = (uint)(color.replace("#","0x"));
var a:uint = (uint)((alpha * .01) * 255);
var rgba:uint = rgb << 8 | a;
trace("hex: #",rgba.toString(16),"test",0x0000ff6b.toString(16));

此外,您提到 Google 很有趣,因为您可以使用搜索来 convert to hex

更新:似乎有点困惑,所以我将这 3 个步骤拆分为函数:

  1. 将十六进制字符串转换为整数
  2. 将 alpha 百分比 (0-100) 转换为 0-255 整数
  3. 连接以上内容

这将是:

function getHex(hexStr:String):uint{
return (uint)(hexStr.replace("#","0x"));
}
function getHexAlpha(alpha:uint):uint{
return (uint)((alpha * .01) * 255);
}
function rgbaConcat(rgb:uint,a:uint):uint{
return rgb << 8 | a;
}
trace("test",rgbaConcat(getHex("#FF9900"),getHexAlpha(50)).toString(16));

或一次性完成:

function rgbaConcat(hexStr:String,alpha:uint):uint{
var rgb:uint = (uint)(hexStr.replace("#","0x"));
var a:uint = (uint)((alpha * .01) * 255);
return (rgb << 8 | a);
}
trace("test",rgbaConcat("#123456",100).toString(16));

关于actionscript-3 - 在 AS3 中将 alpha 百分比转换为 RGBA 十六进制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12946421/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com