如何在处理中将存储为字符串的十六进制颜色值转换为实际的十六进制值



简而言之:例如,如何获得。。。字符串数据中的#C990C0,而不是"#C990C0"

我正在Processing中创建一些原型,所以理想情况下,我正在寻找一个没有额外Java库的解决方案。

在我的数据(json(中,十六进制颜色值存储为字符串。

Processing中有一个unhex()函数可以将String转换为int,但这个int在Processing中作为颜色的表示没有意义。。。并且hex()函数转换为字符串而不是十六进制类型。

您可以硬编码,比如fill(color(#C990C0)),但不能通过编程将字符串"#C990C0"强制转换为#C990C0来完成此操作,因为没有Hex基元类型。

也许答案是对byte基元类型做一些奇怪的事情?

使用unhex()是正确的。

在这种情况下,处理太好了,结果令人困惑。在Processing编辑器中,您可以使用color(#C990C0)(尽管这在其他编辑器中不太容易(。

类似地,color类型是幕后的int。(它将4个字节:alpha、红色、breen、蓝色存储为32位整数(

unhex()还有另一个问题:数字格式。您可以使用从09的数字和字母AF,但不能使用其他前缀(例如#0x(。除此之外,它还期望ARGB中的颜色(而不是RGBA(,这意味着您确实需要指定alpha值(否则,如果前两个十六进制数字(alpha通道(缺少00,则意味着您的颜色将不可见(。

在您的情况下,您可以将颜色格式化为:"FFC990C0"

这是一个测试草图:

JSONObject myData = JSONObject.parse("{"color":"FFC990C0"}");
color myColor = unhex(myData.getString("color"));
fill(myColor);
rect(0, 0, 50, 100);
// notice the colour doesn't show because the FF alpha prefix is missing
fill(unhex("C990C0"));
rect(50, 0, 50, 100);

更新经过一番挖掘,发现以下内容很有趣:

println(JSONObject.parse("{"color":0xC990C0}").get("color") instanceof String);

它在我预期false时打印true(而预期Integer(。(它确实像0-9预期的那样工作,但不是A-F(。

Processing认为0xC990C0String(请注意,它的值周围没有双引号(,这可能是因为这个原因。此外,unhex()使用Long.parseLong(),这限制了0x#或类似前缀的使用。

不过,您可以使用Long.decode("#C990C0")(例如color myColor = Long.parseLong(myData.getString("color")).intValue();(.

最新更新