Сделайте libjpeg и the.Net jpeg-кодек действительно существенно отличается от монохромных данных?


Я работаю с большим количеством монохромных изображений, и сегодня утром я заметил, что существует значительная разница между тем, как libjpeg и кодек .Net jpeg обрабатывают монохромные данные. Похоже, что монохромное изображение, сохраненное при любом качестве с помощью libjpeg и открытое с использованием стандартного .Net jpeg-кодека, на самом деле загружается только с 16 различными оттенками серого, и все промежуточные оттенки отображаются как стиплированные.

Вот гистограмма плавного градиента, сохраненная libjpeg и загружается .net

Гистограмма затронутого конфликтом кодека градиента

Гистограмма должна была быть идеально ровной.

А вот (увеличенный) пример того, как выглядит этот градиент (он должен быть идеально гладким переходом) Введите описание изображения здесь

Это должен быть плавный переход от серого 85 слева к серому 136 справа, но только 4 оттенка серого фактически визуализируются, чтобы сделать этот переход.

Мой вопрос в том, сумасшедший ли я, и если нет, то как далеко заходит это несоответствие кодека? Является есть ли хороший обходной путь, если вы используете обе библиотеки в разных программах?

Я не обвиняю ни один кодек, просто указываю на то, что кажется несоответствием. Я заметил это с изображениями, которые, как я знал, были созданы с помощью libjpeg, предположил, что это проблема настройки качества, попытался использовать FastStone image resizer для создания тестовых изображений и получил тот же результат, попытался использовать irfanview и снова получил тот же результат. Поскольку обе эти программы должны использовать некоторую библиотеку jpeg, я склонен предполагать, что они также использование libjpeg и есть подлинный конфликт кодеков.

На стороне загрузки я столкнулся с тем же результатом загрузки изображений как с моим собственным кодом .net, так и с использованием Paint.net.

Наконец, вот образец с нормальным разрешением, так что вы можете скачать его и попробовать самостоятельно. Загрузка его в некоторые программы даст вам хороший градиент (например, ваш браузер) , но загрузка его с вашим собственным кодом .Net, или Paint.Net даст вам размытый градиент, как показано выше, используя только 16 оттенков серый.

Введите описание изображения здесь

Кто-нибудь знает больше об этом, как далеко это заходит и какие хорошие обходные пути могут быть?

1 12

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 как полноцветное изображение, но только поместить в него значения пикселей в оттенках серого.