3

WPFを使用して16ビットPNG画像用の画像ビューアを構築しようとしています。私のアイデアは、で画像をロードしてからPngBitmapDecoder、それらをImageコントロールに入れ、ピクセルシェーダーで明るさ/コントラストを制御することでした。

しかし、ピクセルシェーダーへの入力はすでに8ビットに変換されているように見えることに気づきました。これはWPFの既知の制限ですか、それともどこかで間違いを犯しましたか?(Photoshopで作成した16ビット画像として検証された白黒グラデーション画像で確認しました)

画像をロードするコードは次のとおりです(16ビット範囲全体でロードすることを確認するために、Imageコントロールに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>
4

1 に答える 1

2

マイクロソフトから返信がありました。これは、WPFレンダリングシステムの実際の制限です。回避策として試してみますD3DImage

于 2009-10-13T14:41:40.203 に答える