Чтение JPEG: ImageIO.read () портит цветовое пространство - PullRequest
4 голосов
/ 19 сентября 2011

Я пытаюсь читать, изменять масштаб и сохранять изображения в сервлете.Это соответствующий код:

BufferedImage image = ImageIO.read(file);

BufferedImage after = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
AffineTransform at = AffineTransform.getScaleInstance(factor, factor);
AffineTransformOp scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
after = scaleOp.filter(image, null);

ImageIO.write(after, "JPG", file));

Исходный файл представляет собой обычный RGB-Jpeg, но когда я открываю и сохраняю файл, он выходит как CMYK-Jpeg.Это происходит, даже если я не изменяю масштаб изображения, просто открывая и закрывая изображение вызывает проблему.

Когда я открываю PNG или GIF, все в порядке.Кто-нибудь знает, что здесь делать?Я ожидаю, что метод чтения ImageIO сохранит исходное цветовое пространство.

Если есть другой удобный способ чтения в формате jpeg?

Спасибо за любые предложения!

Ответы [ 3 ]

4 голосов
/ 20 сентября 2011

Вы создаете after, а затем перезаписываете его scaleOp.filter. Это правильно? Таким образом, ваше after изображение может не быть RGB, даже если вы думаете, что это так? Если вы хотите, чтобы after был RGB, то вам может потребоваться нарисовать image на after перед выполнением преобразования.

1 голос
/ 29 апреля 2013

ImageIO.read игнорирует все встроенные метаданные, включая встроенный цветовой профиль, который определяет, как значения RBG отображаются на физические устройства, такие как экраны или принтеры.

Вы можете прочитать метаданные отдельно и передать их ImageIO.write, но проще просто преобразовать изображение в цветовое пространство sRGB (по умолчанию) и игнорировать метаданные.

Если вы не возражаете против потери метаданных, замените

after = scaleOp.filter(image, null);

на

after = scaleOp.filter(image, after);

Из документации AffineTransformOp.filter:

If the color models for the two images do not match, a color conversion into the destination color model is performed.

1 голос
/ 14 декабря 2011

У меня была такая же проблема, и я нашел эту страницу.

Я попробовал вышеупомянутое предложение создать BufferedImage с правильным типом и использовать его в качестве изображения после, вместо нуля в вызове фильтра; и это действительно решило проблему.

...