Я пытаюсь создать средство просмотра изображений для 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>