绿色像素的颜色无效

时间:2015-10-20 14:06:48

标签: java image colors

对于模拟,我需要解析图像。问题是,下面的代码为绿色返回了错误的值。

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)?

谢谢! :)

1 个答案:

答案 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