C#: Декодирование изображений JPEG с 12-битной точностью с использованием библиотеки Silverlight FJCore?

В моем приложении на C# Silverlight я пытаюсь декодировать изображения DICOM в сжатом синтаксисе передачи JPEG, используя библиотеку классов FJCore.

Изображения DICOM обычно сжимаются с 12-битной точностью. При попытке декодировать такое изображение с использованием исходного исходного кода FJCore, я получаю исключение, говорящее "Неподдерживаемый тип кодека", потому что в исходной реализации FJCore только маркеры начала кадра SOF0 (Baseline DCT) и SOF2 (Progressive DCT) поддерживается. Если я изменю реализацию, чтобы также принять маркер SOF1 (расширенный последовательный DCT) и обрабатывать кадры SOF1 так же, как кадры SOF0, изображения декодируются, но учитываются только 8 битов.

Типичное изображение с 12-битной точностью теперь выглядит так после декодирования с помощью модифицированной библиотеки FJCore:

JPEG-изображение с 12-битной точностью, закодированное FJCore с 8-битной точностью

В идеале изображение должно выглядеть так:

JPEG-изображение с 12-битной точностью, закодированное с полной 12-битной точностью

Насколько я могу судить по реализации FJCore, точность изображения записывается в классе JpegFrame, но она никогда не используется. Кажется, что оригинальная реализация FJCore полностью поддерживает только изображения в градациях серого с точностью до 8 бит.

Я планирую "взять быка за рога" и попытаться самостоятельно расширить FJCore для поддержки 12-битной точности для изображений в градациях серого. Но прежде чем подумать, я решил поставить вопрос здесь, в Stackru, чтобы узнать, сталкивался ли кто-нибудь с этой проблемой раньше и решил ли она? В таком случае я был бы очень рад узнать, как вы решили проблему.

Спасибо заранее!
Андерс @ Куреос

1 ответ

Решение

Я только что обновил свой собственный JPEG-декодер для обработки расширенного режима, и мне нужно было изменить мой обратный DCT. Перед изменением кода вывод выглядел аналогично вашему образцу изображения выше. Я всегда сохранял 16-битные значения коэффициента от энтропийного декодирования, но мои вычисления DCT искажали большие значения, используя 16-битные целые числа для хранения временных значений при выполнении математических вычислений. Я изменил код DCT, чтобы использовать 32-битные целые числа для расчетов, и это решило проблему.

Другие вопросы по тегам