我正在使用BufferedImage
(在PNG中)并希望将颜色替换为另一种颜色。
我将所有颜色存储为字符串以便于处理,但是......
for(int x=0;x<output.getWidth();x++)
for(int y=0;y<output.getHeight();y++)
if(output.getRGB(x,y)==Integer.parseInt("ffff00fe",16))
output.setRGB(x,y,Integer.parseInt("ffaaaaaa",16));
结果整数应为负数,但会抛出NumberFormatException
当我执行output.getRGB(x,y)
时,它会在非透明像素上返回负数
答案 0 :(得分:4)
你可以做到
int number = (int)Long.parseLong("ffff00fe", 16);
答案 1 :(得分:0)
数字2,147,483,647(或十六进制7FFFFFFF)是32位带符号二进制整数的最大正值。你试图转换的东西几乎是两倍,这意味着二进制数的第一位是1;在带符号的二进制整数中,第一位为1意味着它是负数。
基本上,你需要更大的东西来解析它。
请尝试使用(int) Long.parseLong("ffff00fe", 16)
代替Integer.parseInt("ffff00fe",16)
答案 2 :(得分:0)
大于0x7fff_ffff
的值太大而无法作为签名ints.
处理Java 8添加了处理ints
的方法,就好像它们包含无符号值一样。只需将parseInt
替换为parseUnsignedInt:
Integer.parseUnsignedInt("ffaaaaaa", 16)
如果需要使用Java 7及更早版本,可以将其解析为long
,然后将其转换为int.
或者,如果值是常量,则可以将它们写为数字常量例如0xffaaaaaa
或甚至0xffaa_aaaa
并避免处理字符串转换(自Java 7以来允许使用数字下划线,并且可以使它们更容易阅读)。