Действительно ли libjpeg и .Net jpeg-кодек существенно отличаются от монохромных данных?
Я работаю с большим количеством данных монохромного изображения, и этим утром я заметил, что существует существенная разница между тем, как libjpeg и .Net jpeg-кодек обрабатывают монохромные данные. Похоже, что монохромное изображение, сохраненное при ЛЮБОМ настройке качества с использованием libjpeg и открытое с использованием стандартного кодека .Net jpeg, фактически загружает только 16 различных оттенков серого, и все промежуточные оттенки отображаются как зачеркнутые.
Вот гистограмма гладкого градиента, сохраненная libjpeg и загруженная .net
![Histogram of codec conflict affected gradient]()
Гистограмма должна быть совершенно ровной.
И вот (увеличенный) пример того, как выглядит этот градиент (это должен быть совершенно плавный переход)
![enter image description here]()
Это должен быть плавный переход от серого 85 слева к серому 136 справа, но только 4 оттенка серого фактически сделаны, чтобы сделать этот переход.
Мой вопрос: я сумасшедший, и если не только, насколько далеко это несоответствие кодеков? Хорошее обходное решение, если вы используете обе библиотеки в разных программах?
Я не обвиняю ни один кодек, просто указывая на то, что кажется несоответствием. Я заметил это с изображениями, которые, как я знал, были созданы с использованием libjpeg, предположили, что это проблема с настройкой качества, попробовали с помощью resaster resaster для создания тестовых изображений и получили тот же результат, попытались использовать irfanview и снова получили тот же результат. Поскольку обе эти программы должны использовать некоторую библиотеку jpeg, я склонен предположить, что они также используют libjpeg, и существует подлинный конфликт кодеков.
На стороне загрузки я столкнулся с тем же результатом, загружая изображения как своим собственным .net-кодом, так и используя Paint.net.
Наконец, вот пример с нормальным разрешением, чтобы вы могли скачать его и попробовать сами. Загрузка его в некоторые программы даст вам хороший градиент (например, ваш браузер), но загрузите его с помощью собственного кода .Net или Paint.Net, который даст вам отложенный градиент, как показано выше, используя только 16 оттенков серого.
![enter image description here]()
Кто-нибудь знает об этом больше, насколько он идет и какие хорошие обходные пути могут быть?
Ответы
Ответ 1
Я могу воспроизвести ваши симптомы, открыв образец изображения в версии Paint в комплекте с Windows 7. Анализ файла показывает, что он является допустимым JPEG, и если он правильно отображается в браузере, это подтверждает. Похоже, Microsoft действительно испортилась плохо. Он уже представлен как ошибка:
https://connect.microsoft.com/VisualStudio/feedback/details/597657/grayscale-jpeg-image-read-as-format8bppindexed-but-quantized-as-format4bppindexed#details
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/9132e2bd-23cc-4e5a-a783-1fa4abe11624/
Обходным решением будет создание вашего JPEG в виде полноцветного изображения, но в него будут помещаться только значения оттенков серого.