2009-10-09 5 views
3

J'essaye de construire une visionneuse d'image pour des images PNG de 16 bits avec WPF. Mon idée était de charger les images avec PngBitmapDecoder, puis les mettre dans un contrôle Image, et contrôler la luminosité/contraste avec un pixel shader.Pixel shader WPF avec entrée HDR (16 bits)?

Cependant, j'ai remarqué que l'entrée dans le pixel shader semble être déjà convertie en 8 bits. Est-ce une limitation connue de WPF ou ai-je fait une erreur quelque part? (J'ai vérifié cela avec une image en dégradé noir/blanc que j'ai créée dans Photoshop et qui est vérifiée en image 16 bits)

Voici le code pour charger l'image (pour m'assurer que je charge avec le plein 16 bits plage, juste à écrire Source = "test.png" dans les charges de contrôle de l'image comme 8 bits)

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; 

J'ai créé le pixel shader avec le grand 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; 
} 

et intégré dans le shader XAML comme ceci:

<Image Name="image" Stretch="Uniform"> 
    <Image.Effect> 
    <shaders:AutoGenShaderEffect x:Name="MinMaxShader" Minvalue="0.0" Maxvalue="1.0> 
    </shaders:AutoGenShaderEffect> 
    </Image.Effect> 
</Image> 

Répondre

1

Je viens de recevoir une réponse de Microsoft. C'est vraiment une limitation dans le système de rendu WPF. Je vais essayer D3DImage comme une solution de contournement.

Questions connexes