对于模拟,我需要解析图像。问题是,下面的代码为绿色返回了错误的值。
BufferedImage img = ImageIO.read(new File(string));
Simulation s = new Simulation(img.getWidth(), img.getHeight());
byte[] pixels = ((DataBufferByte) img.getRaster().getDataBuffer()).getData();
int index = -1;
for(int y = 0; y<img.getHeight(); y++){
for(int x = 0; x<img.getWidth(); x++){
index++;
if(pixels[index*4+1]==0&&pixels[index*4+2]==0&&pixels[index*4+3]==0)continue;
int r = pixels[index*4+1]; //<-- correct value (in the tested case)
int g = pixels[index*4+2]; //<-- wrong value
int b = pixels[index*4+3]; //<-- correct value (in the tested case)
if(r<0)r=Math.abs(r)+128;
if(g<0){
System.out.println(g);
g=Math.abs(g)+128;
}
if(b<0)b=Math.abs(b)+128;
Color c = getColor(r, g, b);
int rgb = c.getRed() * 256 * 256 + c.getGreen() * 256 + c.getBlue();
if(rgb!=0)System.out.println("FC: "+rgb+ " "+ c.getRed() + " " + c.getGreen() + " " + c.getBlue());
}
}
问题在于,当颜色值高于127时,数字变为负数。这就是为什么我建立了支票if(g<0)
。
测试颜色为红色:76绿色:177蓝色:34。 检查前代码中的值为76-79 34,之后为76 207 34(结果为+30绿色)。为什么绿色像素数组索引没有返回预期的-49(177 unsigned = -49 signed)?
谢谢! :)
答案 0 :(得分:1)
只有绿色具有不良价值的原因是因为它是唯一的一个&gt; 128。
if(r<0)r=Math.abs(r)+128;
这是错误的 - &gt;例如-1应该是255.你的公式给出了127。
使用此公式:if(r<0)r=r+256;
和-79将为177
绿色和蓝色也是一样。
为什么不使用Byte.toUnsignedInt