简而言之:例如,如何获得。。。字符串数据中的#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()
还有另一个问题:数字格式。您可以使用从0
到9
的数字和字母A
到F
,但不能使用其他前缀(例如#
或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认为0xC990C0
是String
(请注意,它的值周围没有双引号(,这可能是因为这个原因。此外,unhex()
使用Long.parseLong()
,这限制了0x
、#
或类似前缀的使用。
不过,您可以使用Long.decode("#C990C0")
(例如color myColor = Long.parseLong(myData.getString("color")).intValue();
(.