2009-10-09 117 views
3

我正試圖用WPF爲16位PNG圖像構建圖像查看器。我的想法是使用PngBitmapDecoder加載圖像,然後將它們放入Image控件中,並使用像素着色器控制亮度/對比度。帶有HDR(16位)輸入的WPF像素着色器?

但是,我注意到像素着色器的輸入似乎已經轉換爲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 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

我剛剛從微軟的迴應。這實際上是WPF渲染系統中的一個限制。我會嘗試D3DImage作爲解決方法。

相關問題