具有 HDR(16 位)输入的 WPF 像素着色器?

发布于 2024-08-07 03:20:49 字数 1583 浏览 7 评论 0原文

我正在尝试使用 WPF 构建 16 位 PNG 图像的图像查看器。我的想法是使用 PngBitmapDecoder 加载图像,然后将它们放入 Image 控件中,并使用像素着色器控制亮度/对比度。

然而,我注意到像素着色器的输入似乎已经转换为 8 位。这是 WPF 的已知限制还是我在某个地方犯了错误? (我使用在 Photoshop 中创建的黑白渐变图像进行了检查,该图像被验证为 16 位图像)

以下是加载图像的代码(为了确保我加载完整的 16 位范围,只需编写图像控件中的 Source="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 着色器效果工具

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>

I'm trying to build an image viewer for 16-bit PNG images with WPF. My idea was to load the images with PngBitmapDecoder, then put them into an Image control, and control the brightness/contrast with a pixel shader.

However, I noticed that the input to the pixel shader seems to be converted to 8 bit already. Is that a known limitation of WPF or did I make a mistake somewhere? (I checked that with a black/white gradient image that I created in Photoshop and which is verified as 16-bit image)

Here's the code to load the image (to make sure that I load with the full 16-bit range, just writing Source="test.png" in the Image control loads it as 8-bit)

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;

I created the pixel shader with the great 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;
}

And integrated the shader into XAML like this:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

ζ澈沫 2024-08-14 03:20:49

我刚刚收到微软的回复。这确实是 WPF 渲染系统的一个限制。我将尝试使用 D3DImage 作为解决方法。

I just got a response from Microsoft. It's really a limitation in the WPF rendering system. I'll try D3DImage as a workaround.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文