我目前正在将一个复杂的工具从Winforms转换为WPF,这个图像在我的移植版本中无法正常显示:它只显示图像的一个小区域。通过注释掉ColorMatrix的创建,我能够重现原始(Winforms)版本中的错误。我读了Colormatrices,我想我已经弄清楚了原始矩阵在做什么,所以我可以在shaderEffect中重现它。 不幸的是,我制作的ShaderEffect不起作用,我想知道是否有一些关于ColorMatrices的东西,我不明白这会挫败我转换它的尝试。
这是原始的ColorMatrix:
return new ColorMatrix(new[]
{
new [] { r , 0.0f, 0.0f, 0.0f, 0.0f },
new [] { 0.0f, g , 0.0f, 0.0f, 0.0f },
new [] { 0.0f, 0.0f, b , 0.0f, 0.0f },
new [] { 0.0f, 0.0f, 0.0f, a , 0.0f },
new [] { 0.0f, 0.0f, 0.0f, 1-a , 1.0f }
});
我已经检查了,当它到达此图像的这行代码时,r,g和&的值。 b总是1.0f。 'a'的值为0。
这是我的等效PixelShader:
float red : register(C0);
float green : register(C1);
float blue : register(C2);
float alpha : register(C3);
sampler2D implicitInputSampler : register(S0);
float4 main(float2 uv : TEXCOORD) : COLOR
{
// Get the source color
float4 color = tex2D(implicitInputSampler, uv);
color.r *= red;
color.g *= green;
color.b *= blue;
color.a = alpha;
// Return new color
return color;
}
我为红色,绿色和蓝色设置的值alpha是:(1,1,1,1)。我将alpha设置为1与将alpha缩放为0然后将其翻译为1相同。
我知道我的着色器正在应用,因为它已经在处理其他图像时取消了alpha图层并用黑色像素替换它(这就是我想要的)。它在此图像中具有相同的效果,但它仍然只显示一个小区域。
我没有正确转换此矩阵吗?
编辑:以下是xaml中应用效果的方式:
<Canvas Width="64" Height="64" Margin="5,-15,0,0">
<!--Draw a checkered rectangle underneath the image. If the image fails to load, all we'll see is a texture pattern. If the image
has transparency, we'll see part of the texture pattern -->
<Rectangle Fill="{Binding Path=CheckerBrush, ElementName=This}" Stretch="Fill" Margin="0,0" Width="64" Height="64"/>
<Image Stretch="Fill" Name="imgPreview" Margin="0,0" Width="64" Height="64"
Effect="{Binding Path=Tint, ElementName=This, Converter={StaticResource tintToEffectConverter}}"/>
</Canvas>
这是转换器:
public class TintToEffectConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Color tint = (Color)value;
ColorScaleEffect effect = new ColorScaleEffect();
effect.RedScale = (float)tint.R / 255.0f;
effect.GreenScale = (float)tint.G / 255.0f;
effect.BlueScale = (float)tint.B / 255.0f;
effect.Alpha = 1;
return effect;
}
....