将RGB转换为HEX

5

如何在AS3中将RGB颜色转换为HEX?例如:R=253 G=132 B=58。

谢谢。

4个回答

17

Robusto的解决方案太慢了。

因为RGB值是按这种方式存储的:

8b Red | 8b Green | 8b Blue

值为0-255(这不是巧合)也有8个字节,您可以使用左位移来获取int值,然后可以获得十六进制(速度几乎快3倍)。所以:

var intVal:int = red << 16 | green << 8 | blue;
var hexVal:String = intVal.toString(16);
hexVal = "#" + (hexVal.length < 6 ? "0" + hexVal : hexVal);

当你想要转换的RGB值为红色绿色蓝色时。


1
如果您使用ARGB(即BitmapData.getPixel32()),请不要忘记alpha通道。alpha << 24 | red << 16 | green << 8 | blue - gthmb
但那将是_A_RGB,不是吗:D 这(我相信)更适用于传统用途,如调色板选择器,或用于CSS / HTML用法的转换器 - 颜色始终以#RRGGBB或#RGB格式表示 - 没有alpha。 - Aurel Bílý
如果 R 通道只有一个十六进制数字怎么办?这将返回“#40404”。大多数应用程序都在寻找“#040404”。 - Meekohi
因为实际的toString(16)没有设置结果字符串长度的方法,所以您必须自己添加前导零。比如说,你想要纯蓝色,蓝色=255,红色=0,绿色=0。在这里,你会收到一个#FF的输出,而你想要的是#0000FF。所以,你取intVal.toString(16)的结果并检查它的长度,然后添加前导零直到它达到6位,再在前面加上一个#符号。 - Vesper

3

将RGB数字转换为十六进制值并连接它们。

var hexVal = (253).toString(16) + (132).toString(16) + (58).toString(16);
hexVal = "#" + hexVal;
// returns "#fd843a"

这种方法不够优雅,但是它应该能让您理解。

3
你的代码里有一个 bug。如果任何组件只有一个十六进制数字(即 component < 16),则在左侧的组件将会向右移动一个位置,这会导致错误结果(除非左边的值是零)。你需要对每个组件进行补零处理,但此时,最好直接使用位移运算,我想。 - Juan Pablo Califano
@Juan Pablo:我并不打算提供详尽的解决方案,只是想说明一种思路,即将十进制转换为十六进制。我没有时间为他人编写无漏洞的优化代码,但如果你有这样的能力,那就更好了。 - Robusto
是的,我理解你的意思。如果我的评论听起来很严厉,我很抱歉,我并不是那个意思。我只是认为值得提一下,以防有人想直接使用发布的代码时出现问题。 - Juan Pablo Califano

3

Aurel300的方法是标准的方式,我建议你使用它。Robusto的解决方案是错误的。

如果你想避免位运算,另一种选择是使用简单的算术运算:

var intVal:int = red * 0x10000 + green * 0x100 + blue;

或者,如果您认为十六进制表示法会引起混淆。
var intVal:int = red * 65536 + green * 256 + blue;

我发表这篇文章只是为了向您展示另一种获取十六进制值的方法(我认为这种方法更清楚地说明了组件如何相互作用并添加到最终值中),但正如我已经说过的,我会使用Aurel300的代码。


1

大多数应用程序需要六位十六进制代码来表示颜色:

function RGBtoHEX(r, g, b) { 
    var s = (r << 16 | g << 8 | b).toString(16); 
    while(s.length < 6) s="0"+s;
    return "#"+s;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接