почему белый цвет становится серым?

#java

#java

Вопрос:

у меня есть изображение в формате png, содержащее прозрачные части, и я хочу сделать эти части белыми. Поскольку я не нашел способа с имеющимися у меня программами, я подумал, что просто напишу небольшую программу:

 BufferedImage img = ImageIO.read(new File("D:\temp\myimg.png"));
int w = img.getWidth();
int h = img.getHeight();
int white = new Color(255,255,255,255).getRGB();
for(int j = 0; j < h; j  ) {
    for(int i = 0; i < w; i  ) {
        Color color = new Color(img.getRGB(i, j), true);
        int alpha = color.getAlpha();
        if(alpha==0) img.setRGB(i, j, white);
    }
}
ImageIO.write(img, "png", new File("D:\temp\myimg2.png"));
  

но каким-то образом результирующее изображение имеет цвет 222,222,222 (альфа: 255) вместо белого.
Что я здесь делаю не так?

Комментарии:

1. Почему вы устанавливаете альфа на 255? Почему не 0?

2. Вы уверены, что не существует альфа-значений, которые очень малы, но не равны нулю? Возможно, некоторые пиксели находятся 222,222,222,1 там, где 1 — это альфа. Кроме того, что произойдет, если вы закомментируете цикл for, чтобы изображение просто считывалось и сохранялось? Является ли результат идентичным?

3. я проверил, все они равны 0 или 255. (я создал Set<Integer> и добавил их все, в результате были только эти 2 числа)

4. Поэтому попробуйте закомментировать весь цикл for, чтобы изображение просто загружалось и сохранялось. Возможно, это то, что меняет пиксели.

Ответ №1:

Могут быть пиксели, альфа которых не равна 0, а скорее очень маленькому числу, например 5. таким образом, вы просто заменяете эти пиксели на альфа 0, что приводит к оттенку серого.

Поэтому попробуйте это и посмотрите, изменится ли результат:

  if(alpha < 10) img.setRGB(i, j, white);
  

Комментарии:

1. я проверил, все они равны 0 или 255. (я создал Set<Integer> и добавил их все, в результате были только эти 2 числа)

2. хорошо, тогда, возможно, в пустой области вашей фотографии у вас есть сочетание пикселей с альфа-0 и 255 (альфа-ноль в большинстве). выполните тест. создайте png-файл в Photoshop с квадратной половиной цвета, наполовину полностью пустой, и запустите на нем свой алгоритм. если это работает, то то, что я сказал, правильно, и вам нужно полностью реструктурировать свой код, потому что он не будет работать с этим файлом png.