문제

WPF를 사용하여 16 비트 PNG 이미지의 이미지 뷰어를 빌드하려고합니다. 내 생각은 이미지를로드하는 것이 었습니다 PngBitmapDecoder, 그런 다음 그것들을 안에 넣습니다 Image 픽셀 셰이더로 밝기/대비를 제어하고 제어하십시오.

그러나 픽셀 셰이더에 대한 입력이 이미 8 비트로 변환 된 것으로 보입니다. WPF의 알려진 한계입니까, 아니면 어딘가에 실수를 했습니까? (Photoshop에서 만든 흑백 구배 이미지로 16 비트 이미지로 확인 된 흑백 구배 이미지로 확인했습니다).

이미지를로드하는 코드는 다음과 같습니다 (전체 16 비트 범위로로드하고 이미지 컨트롤에서 소스 = "test.png"를 작성하면 8 비트로로드합니다).

BitmapSource bitmap;
using (Stream s = File.OpenRead("test.png"))
{
  PngBitmapDecoder decoder = new PngBitmapDecoder(s,BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
  bitmap = decoder.Frames[0];
}

if (bitmap.Format != PixelFormats.Rgba64)
  MessageBox.Show("Pixel format " + bitmap.Format + " is not supported. ");

bitmap.Freeze();
image.Source = bitmap;

나는 위대한 픽셀 셰이더를 만들었습니다 Shazzam 셰이더 효과 도구.

sampler2D implicitInput : register(s0);

float MinValue : register(c0);
float MaxValue : register(c1);

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 color = tex2D(implicitInput, uv);

 float t = 1.0f / (MaxValue-MinValue);

    float4 result;    
    result.r = (color.r - MinValue) * t;
    result.g = (color.g - MinValue) * t;
    result.b = (color.b - MinValue) * t;
    result.a = color.a;

    return result;
}

셰이더를 다음과 같이 XAML에 통합했습니다.

<Image Name="image" Stretch="Uniform">
  <Image.Effect>
    <shaders:AutoGenShaderEffect x:Name="MinMaxShader" Minvalue="0.0" Maxvalue="1.0>
    </shaders:AutoGenShaderEffect>
  </Image.Effect>
</Image>
도움이 되었습니까?

해결책

방금 Microsoft로부터 응답을 받았습니다. WPF 렌더링 시스템의 한계입니다. 시도해 볼게요 D3DImage 해결 방법으로.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top