我正在尝试创建图像的(平均)灰度,我似乎没有得到每个像素的值。在总结平均值时,我认为我没有做正确的计算,但我找不到有什么问题。
public byte[] changePixelValues(byte blue, byte green, byte red) {
//Convert to greyscale by average
byte avg;
int sum = 0;
sum +=blue;
sum += green;
sum += red;
avg = (byte) (sum / 3);
//System.out.println("avg: " + avg);
byte[] values = new byte[3];
values[0] = avg;
values[1] = avg;
values[2] = avg;
return values;
类型转换中是否有遗漏的内容?
编辑:
输入如下,其中byte []数据是来自BufferedImage的原始数据,在这种情况下没有alphaRaster。
for (int i = 0; i < data.length; i += 3) {
byte [] newData = changer.changePixelValues(data[i], data[i+1], data[i+2]);
System.arraycopy(newData,0,data,i,3);
}
答案 0 :(得分:1)
首先,如果要将图像转换为灰度,则方法应该只返回一个字节值而不是字节数组。如果返回一个字节,则可以将该值分配给每个RGB通道,并获得灰度图像或将该值设置为8位图像。
你需要记住java中的字节是有符号的(范围-128到127),所以如果你有例如R通道值等于200(通道值可能在0到255范围内)并且你把它转换为字节,值等于-56。因此,如果计算平均值(假设G = B = 100),则平均值等于48(应为133)。