2009-07-09 2 views
3

.NET 3.5 sp1에서 WPF를 사용하여 표시하려는 16 비트 회색 명암 이미지가 있습니다. 현재 OpenGL을 사용하여 이미지 표시 형식을 휘도 16으로 설정 한 내장 된 Winform을 사용하여 이미지를 표시합니다.WPF 이미지 및 DirectX SurfaceFormat

DirectX의 속성은 SurfaceFormat입니다.

WPF에서 이미지를 표시하고 SurfaceFormat을 Luminance16으로 설정할 수 있기를 원합니다. 어떻게해야합니까?

참고 : 현재 WPF는 기본적으로 Gray16을 지원하지만 Gray16을 제대로 렌더링하지 않습니다.

편집 : 실제 답변은 WPF가 말하는대로 작동하지 않는다는 것입니다. Gray16은 기본적으로 지원되지만 실제로 16 비트 디스플레이에 맞추기 위해 256으로 나눕니다. Gray16 형식은 눈에 산처럼 타는 거짓말입니다.

답변

2

WPF에서는이 작업을 수행하지 않아도됩니다.

WPF는 16bpp grayscale images natively을 지원합니다. TIFF 포맷 디코더를 사용하여 TIF 파일에서로드 할 수 있다고 생각합니다. reponse에


편집 댓글을 : 당신은 WPF의 기본 렌더링에 불만이 있다면

, 당신은 직접 표면을 렌더링하기 위해 다이렉트 X를 사용할 수 있습니다. 이것은 (따라서) C++/CLI를 사용하여 수행하는 것이 가장 좋지만 SlimDX를 사용하는 C#에서는 전적으로 가능합니다.

최선의 방법은 D3DImage입니다. CodeProject에서 이것을 사용하는 방법에 대한 소개가 있습니다. DX의 차이점을 고려하여 OpenGL 코드를 거의 직접 포팅 할 수 있어야합니다. 그러나 D3DImage에 대한 좋은 점은 더 이상 공통된 컨트롤을 호스트 할 필요가 없다는 것입니다.이를 WPF 브러시에 직접 넣고 WPF의 어느 곳에서나 사용할 수 있습니다.

+0

네,하지만 실제로는 그렇지 않습니다. 네이티브 지원은 OpenGl에서 8 비트 휘도 이미지로 표시되는 것처럼 이미지가 정확히 디더링되도록합니다. – mmr

+0

@ mmr : 나는 나의 대답을 더 많은 정보로 편집했다. –

+0

@ Reed-- 나는 d3d를 피하기를 바랬지 만, 안녕하세요, winforms 캡슐화를 제거합니다. 나는 그것을 조사 할 것이다. – mmr

0

WPF는 실제 문제가 아닙니다. 대부분의 스크린은 16 비트 출력을 지원하지 않으므로 16 비트 회색 레벨을 8 비트로 압축해야합니다.
이것은 256으로 나누거나 2^16 그레이 레벨을 다른 방식으로 256 개의 빈으로 다이빙하는 히스토그램 기반 알고리즘을 사용하여 수행 할 수 있습니다.

이 경우 이미지 처리가 필요하며 다양한 접근법에 대한 기사가 많이 있습니다 (높은 동적 범위 이미지 표시를위한 검색). HLSL 쉐이더를 사용하여 도움을받을 수 있습니다.

+0

아,하지만 내가 표시하는 화면은 11 비트 ACR 인증 유방 X 선 사진입니다. 따라서 8 비트 압축은 잘못되었을뿐만 아니라 의사가 볼 수 있어야하는 암을 의사가 볼 수 없으면 생명을 위협 할 수 있습니다.또한, 레코드의 경우 256으로 나눈 값은 전체 16 비트 범위로 가정합니다. 이는 대부분의 이미징에서 거의 발생하지 않습니다. 최근 중간 형식의 백에서만 16 비트 이미지를 출력합니다. 일반적으로 12 또는 14입니다. – mmr

+0

그런 경우 사용자가 지정한 높은 동적 범위 디스플레이 솔루션에 히스토그램 기반 16-11 비트 압축을 추가해야합니다. (그렇지 않으면 32로 나눕니다.) –