Почему Java ImageIO сглаживает цвета JPEG

Можно использовать nm -g инструмент от binutils набора инструментальных средств. Однако их источник не всегда легко доступен. и я не на самом деле даже уверен, что эта информация может всегда получаться. Возможно objcopy показывает дополнительную информацию.

РЕДАКТИРОВАНИЕ/: название инструмента, конечно nm. Флаг -g используется для показа только экспортируемых символов.

10
задан ketorin 13 August 2009 в 14:02
поделиться

4 ответа

Причин может быть несколько.

  1. Цветовые данные JPEG часто хранятся как YCrCb вместо RGB, хотя преобразования должны быть в основном незаметными.
  2. JPEG часто имеет встроенный цветовой профиль, но многие приложения не понимают этого и просто игнорируют его (в этом случае в вашем выходном файле может отсутствовать цветовой профиль).
  3. Значение гаммы может быть сброшено или отсутствовать после того, как Java изменит его.

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

Изменить: Да, ясно, что ваши исходное и преобразованное изображения имеют разные цветовые профили. Java удалила исходный цветовой профиль и вместо этого использовала общий sRGB. Для нас они выглядят одинаково в Windows с Firefox и другими программами, потому что эти программы не используют цветовой профиль при визуализации. Однако на вашем Mac Mac фактически поддерживает эти цветовые профили (обсуждение на Mac для графики и т. Д.), Поэтому они отображаются по-разному. У меня под рукой нет Mac, но я подозреваю, что если вы откроете файлы в Photoshop на любой платформе, вы увидите разницу.

10
ответ дан 4 December 2019 в 00:26
поделиться

Возможно, вашему исходному изображению назначен цветовой профиль с гаммой шире, чем sRGB (например, Adobe RGB), и ваш цикл загрузки / сохранения не сохраняет информацию о цветовом пространстве? Без цветового профиля ваш зритель будет использовать sRGB, а сжатая гамма заставит все выглядеть «мля». Если у вас есть exiftool,

exiftool -ProfileDescription filename.jpg

- это быстрый способ проверить цветовые профили в исходных и выходных изображениях.

2
ответ дан 4 December 2019 в 00:26
поделиться

JPEG - это формат с потерями .

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

Кроме того, ImageIO.write () , вероятно, использует некоторые настройки качества по умолчанию для сохранения файлов JPEG, которые могут быть ниже исходных , что приведет к дополнительной потере качества.

Попробуйте сохранить файл в формате PNG, и вы увидите, что он будет выглядеть так же, как исходный.

0
ответ дан 4 December 2019 в 00:26
поделиться

jpeg - это формат с потерями. При чтении java сохраняет его как необработанный формат, очень похожий на BMP. Затем он снова записывается, что приводит к потере данных. Кроме того, нет особого контроля над качеством, как при использовании чего-то вроде GIMP.

Возможно, стоит попробовать использовать другие API, например Image Magick , чтобы лучше контролировать качество.

0
ответ дан 4 December 2019 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: