Я пытаюсь создать (среднюю) шкалу серого для изображения и, похоже, не получаю значения для каждого пикселя. Я думаю, что при суммировании среднего я не правильно делаю расчеты, но я не могу найти, что не так.
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);
}
sum / 3
- целочисленное деление. Вы можете использоватьsum / 3.0
, чтобы сделать его двойным делением с последующим округлением до байта:avg = (byte) (Math.round(sum / 3.0))
. Не уверен, правда ли в этом ваша проблема. - person Seelenvirtuose   schedule 25.07.2015changePixelValues()
? - person Tim Biegeleisen   schedule 25.07.2015BufferedImage.getData()
, обратите внимание, что он возвращает копию данных изображения, это означает, что изменение содержимого массива не меняет BufferedImage. - person EmirCalabuch   schedule 25.07.2015Y′ = 0.299 R′ + 0.587 G′ + 0.114 B′
Почему шкала серого работает именно так? - person phuclv   schedule 25.07.2015