2009-10-09 2 views
3

Я пытаюсь создать средство просмотра изображений для 16-битных изображений PNG с помощью WPF. Моя идея состояла в том, чтобы загрузить изображения с помощью PngBitmapDecoder, а затем поместить их в элемент управления Image и управлять яркостью/контрастностью с помощью пиксельного шейдера.WPF пиксельный шейдер с HDR (16-разрядным) входом?

Однако я заметил, что вход в пиксельный шейдер, похоже, уже преобразован в 8 бит. Это известное ограничение WPF или я где-то ошибаюсь? (Я проверил это с черно-белым изображением градиента, которое я создал в Photoshop и которое проверено как 16-битное изображение)

Код загрузки для загрузки (чтобы убедиться, что загружаюсь с полной 16-разрядной диапазон, просто писать Source = «test.png» в нагрузках управления Image как 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 shader effect tool.

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> 

ответ

1

Я только что получил ответ от Microsoft. Это действительно ограничение в системе рендеринга WPF. Я попробую D3DImage в качестве обходного пути.