javax.imageio.ImageIO читает неправильные значения RGB на изображениях в градациях серого - PullRequest
5 голосов
/ 20 декабря 2011

У меня есть изображение, назовите его grayscale.jpg.Теперь я открываю это изображение в Gimp, меняю цветовой режим на RGB и сохраняю его как color.jpg.Если я просматриваю grayscale.jpg и color.jpg в любой программе просмотра изображений, они выглядят точно так же.Но если я открою изображения с помощью javax.imageio.ImageIO

import javax.imageio.ImageIO;

input = ImageIO.read(new File("grayscale.jpg"));
System.out.format("Grayscale value: %x\n", input.getRGB(200, 200));

input = ImageIO.read(new File("color.jpg"));
System.out.format("Color value: %x\n", input.getRGB(200, 200));

Цветное изображение вернет правильное значение, скажем, 0xff6c6c6c.Изображение в оттенках серого вернет другое, более светлое, неправильное значение, например 0xffaeaeae.

Grayscale value: 0xffaeaeae // Incorrect (Lighter)
Color value:     0xff6c6c6c // Correct

Другими словами, javax.imageio.ImageIO считает, что изображения в оттенках серого намного светлее, чем они есть на самом деле.Как я могу точно прочитать изображения в оттенках серого?

Редактировать

Вот еще контекст.Мои пользователи загружают изображения, которые могут быть в оттенках серого.Моя Java работает на сервере и выполняет довольно сложную обработку изображений.Таким образом, идеальным решением является просто исправить мой Java-код, а не что-то комбинировать с помощью инструментов командной строки.

1 Ответ

0 голосов
/ 20 декабря 2011

Ваш тест не имеет значения, потому что вы используете JPEG, что с потерями. В зависимости от сжатия у вас могут быть другие значения цвета. Итак, попробуйте то же самое с PNG, который без потерь.

Вы можете использовать это изображение для проверки правильности javax.imageio. С помощью Gimp конвертируйте его в оттенки серого и сохраните как PNG. Затем загрузите оба (этот и преобразованный) одинаково. И сравните в цикле for все цвета оси Y.

enter image description here

Пример кода:

BufferedImage inputGrayscale = ImageIO.read(new File("grayscale.png"));    
BufferedImage inputColor = ImageIO.read(new File("color.png"));

for (int i = 0; i < 256; ++i)
{
    System.out.printf(i + "Grayscale value: %x\n", inputGrayscale.getRGB(10, i));
    System.out.printf(i + "Color value: %x\n", inputColor.getRGB(10, i));
    System.out.println();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...