Вопрос по wpf, .net – WPF-изображение и DirectX SurfaceFormat

3

У меня есть 16-битное изображение в градациях серого, которое я хочу отобразить с помощью WPF в .NET 3.5 sp1. В настоящее время я отображаю это изображение с помощью встроенной winform, которая использует OpenGL для установки формата отображения изображения на Luminance 16.

DirectX имеет похожее свойство,SurfaceFormat.

Я хочу иметь возможность отображать изображение в WPF и установить SurfaceFormat на Luminance16. Как я могу это сделать?

Примечание. В настоящее время, хотя WPF изначально поддерживает Gray16, он не отображает Gray16 должным образом.

Изменить: реальный ответ заключается в том, что WPF не делает то, что он говорит, что делает. Gray16, хотя и поддерживается изначально, фактически делится на 256, чтобы уместиться в 16-битный дисплей. Таким образом, формат Gray16 - это ложь, которая горит, как кислота в глазах.

Ваш Ответ

2   ответа
0

ют 16-битный вывод, поэтому вам необходимо сжать 16-битные уровни серого до 8-битных.

Это можно сделать путем деления на 256 или использования алгоритма на основе гистограммы для погружения уровня серого 2 ^ 16 в 256 бинов другим способом.

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

В этом случае вам следует добавить 16–11-битное сжатие на основе гистограммы к решению для отображения с высоким динамическим диапазоном, которое вы получили. (В противном случае вы делите на 32.)
Ах, но экраны, на которых я показываю, являются маммографическими экранами, аккредитованными ACR 11 бит. Таким образом, 8-битное сжатие является не только неправильным, оно потенциально опасно для жизни, если врач не может видеть рак, который он должен видеть. Кроме того, для записи деление на 256 предполагает полный 16-битный диапазон, что редко встречается в большинстве изображений. Только последние спины среднего формата выдают 16-битные изображения, обычно это 12 или 14. mmr
2

WPF поддерживаетИзображения в градациях серого 16bpp, Я считаю, что они могут быть загружены из файла TIF, используя встроенный декодер формата TIFF.

Редактировать в ответ на комментарий:

Если вы недовольны отображением по умолчанию в WPF, вы также можете использовать DirectX для непосредственного отображения поверхности. Это (таким образом) лучше всего делать с использованием C ++ / CLI, но это вполне возможно в C # с использованием SlimDX.

Лучший подход - использоватьD3DImage, Вступление к использованию этого наCodeProject, Вы должны иметь возможность напрямую переносить код OpenGL, принимая во внимание различия в DX. Хорошая вещь о D3DImage, тем не менее, заключается в том, что вам больше не нужно размещать общий элемент управления - вы можете поместить его непосредственно в кисть WPF и использовать в любом месте WPF.

Есть ли проблемы с производительностью при использовании D3DImage + SlimDX или каким-либо другим решением, которое вы в итоге использовали? Сколько времени занимает рендеринг одного кадра?
Использование D3DImage + SlimDX очень, очень быстро ... SlimDX - отличное решение, и я сделал это довольно хорошо. Лично у меня DX-рендеринг привязан к текущему таймеру Dispatcher, поэтому он происходит со скоростью 60-65 FPS (то же самое, что и интерфейс WPF, в то же время). Для процессора обработки изображений вы могли бы делать это так быстро, как вы хотите, но нет никакой реальной причины идти быстрее, чем обновление вашего монитора.
@mmr: я отредактировал свой ответ с дополнительной информацией.
@ Рид-- Я надеялся избежать d3d, но эй, он действительно удаляет инкапсуляцию winforms. Я проверю это. mmr
да, но на самом деле я делаю. Нативная поддержка вызывает сглаживание изображений точно так же, как если бы они отображались как 8-битные изображения с яркостью в OpenGl. mmr

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