У меня есть метод, который читает изображения, преобразует их (размер, формат) и записывает их обратно. Это всегда срабатывало очень хорошо, но теперь я сталкивался с некоторыми изображениями в формате JPEG (из агентства печати), которые, очевидно, содержат некоторые метаданные (IPTC). При преобразовании этих изображений цвета не соответствуют действительности. Мое первое предположение заключалось в том, что это изображения CMYK, но это не так.
Проблема должна исходить из чтения, потому что неважно, преобразую ли я изображение в меньший JPEG или PNG, он всегда выглядит одинаково.
Сначала я использовал ImageIO.read()
для чтения изображения. Теперь я получаю фактический ImageReader
через ImageIO.getImageReadersByMIMEType()
и пытаюсь сказать читателю игнорировать метаданные, установив параметр ignoreMetadata
ImageReader#setInput(Object input, boolean seekForwardOnly, boolean ignoreMetadata)
, но не получив успеха.
Затем я создал версию изображения без метаданных (используя Fireworks). Это изображение преобразуется правильно.
Единственное различие, которое я смог выяснить, заключается в том, что с неработающим изображением значение переменной читателя colorSpaceCode
составляет 2, в то время как рабочий образ имеет значение 3. Там также outColorSpaceCode
, который 2 для обоих изображений.
Вы можете получить исходное изображение (~ 3 МБ), перейдя здесь и нажав кнопку "скачать". Левое изображение ниже показывает, что я получаю от исходного изображения, справа показывает, как оно должно выглядеть.