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:
В идеале изображение должно выглядеть так:
Насколько я могу судить по реализации FJCore, точность изображения записывается в классе JpegFrame, но она никогда не используется. Кажется, что оригинальная реализация FJCore полностью поддерживает только изображения в градациях серого с точностью до 8 бит.
Я планирую "взять быка за рога" и попытаться самостоятельно расширить FJCore для поддержки 12-битной точности для изображений в градациях серого. Но прежде чем подумать, я решил поставить вопрос здесь, в Stackru, чтобы узнать, сталкивался ли кто-нибудь с этой проблемой раньше и решил ли она? В таком случае я был бы очень рад узнать, как вы решили проблему.
Спасибо заранее!
Андерс @ Куреос
1 ответ
Я только что обновил свой собственный JPEG-декодер для обработки расширенного режима, и мне нужно было изменить мой обратный DCT. Перед изменением кода вывод выглядел аналогично вашему образцу изображения выше. Я всегда сохранял 16-битные значения коэффициента от энтропийного декодирования, но мои вычисления DCT искажали большие значения, используя 16-битные целые числа для хранения временных значений при выполнении математических вычислений. Я изменил код DCT, чтобы использовать 32-битные целые числа для расчетов, и это решило проблему.