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>