图像像素滑块效果不起作用

时间:2014-05-05 10:08:38

标签: wpf image slider shader pixel-shader

我正在为图像使用PixelShader效果。

  1. 用于调整对比度,亮度,CMY和& RGB使用SLIDERS
  2. 混合模式预定义的图像效果&加载到组合框中,用户可以选择自己的选择。
  3. 这是用于调整对比度,亮度,CMY和&的Image元素和图像效果。 RGB以这种方式应用。

    <Viewbox  x:Name="cImage" Stretch="Uniform"  Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" Margin="0" >
        <Image x:Name="ViewedPhoto"   Source="IMG_0071.jpg" 
        Stretch="None" VerticalAlignment="Top" HorizontalAlignment="Left"  Margin="0,5,0,95" >
            <Image.Effect>
                <l:BrightContrastEffect 
                Brightness="{Binding Value, ElementName=bVal}"
                Contrast="{Binding Value, ElementName=cVal}"
                Red="{Binding Value, ElementName=rVal}"
                Green="{Binding Value, ElementName=gVal}"
                Blue="{Binding Value, ElementName=blVal}"
            />
    
            </Image.Effect>
        </Image>
    </Viewbox>
    

    亮度滑块:

        <Slider Maximum="1" Minimum="-1"  x:Name="bVal"  TickFrequency="1" TickPlacement="BottomRight"  />
    <StackPanel Orientation="Horizontal">
                    <TextBox Text="{Binding Value, ElementName=bVal, UpdateSourceTrigger=PropertyChanged}"  TextAlignment="Right" Width="30"  Height="10" Margin="0" RenderTransformOrigin="-1.167,0.423" Visibility="Hidden"/>
    </StackPanel>
    

    从上面我移动滑块以调整对比度,亮度,CMY&amp; RGB,it's working

    我使用comboBox应用预定义的混合模式图像效果。

    <ComboBox x:Name="cColorEffects"  SelectionChanged="cColorEffects_SelectionChanged" />
    

    为了显示我首先调用ViewedPhoto.Effect = null;的不同效果。然后应用所选效果。

    if (cColorEffects.SelectedIndex == 0)
    {
        ViewedPhoto.Effect = null;
        ViewedPhoto.Effect = new AverageEffect();
    }
    if (cColorEffects.SelectedIndex == 1)
    {
        ViewedPhoto.Effect = null;
        ViewedPhoto.Effect = new ColorBurnEffect();
    }
    

    问题:

    1. 我正在通过comboBox调用另一个图像效果,因此用于调整对比度,亮度,CMY和&amp; RGB无效。

    2. 我正在使用ViewedPhoto.Effect = null;图像效果调整对比度,亮度,CMY和&amp; RGB不工作。

    3. 我想the sliders working for adjusting对比度,亮度,CMY&amp; RGB和apply the blend mode image effects simultaneously。我怎样才能解决这个问题?或者给我一个想法来解决这个问题?

      编辑:

      我一直以为我可以用编程方式进行滑块绑定和图像效果。是否有意义?如果它是好的;我该如何申请?

      <Image x:Name="ViewedPhoto"   >
          <Image.Effect>
              <l:BrightContrastEffect 
              Brightness="{Binding Value, ElementName=bVal}"
              Contrast="{Binding Value, ElementName=cVal}"
              Red="{Binding Value, ElementName=rVal}"
              Green="{Binding Value, ElementName=gVal}"
              Blue="{Binding Value, ElementName=blVal}"
          />
      
          </Image.Effect>
      </Image>
      
      <Slider Maximum="1" Minimum="-1"  x:Name="bVal"  TickFrequency="1" TickPlacement="BottomRight"  />
      <StackPanel Orientation="Horizontal">
          <TextBox Text="{Binding Value, ElementName=bVal, UpdateSourceTrigger=PropertyChanged}"  Visibility="Hidden"/>
          <Button x:Name="bReset" Content="R" Height="10" Width="30" Margin="35,0,0,0" Click="bReset_Click"/>
      </StackPanel>
      
      <Slider Maximum="1" Minimum="-1" x:Name="cVal" TickFrequency="1" TickPlacement="BottomRight" />
      <StackPanel Orientation="Horizontal">
          <TextBox Text="{Binding Value, ElementName=cVal, UpdateSourceTrigger=PropertyChanged}"    Visibility="Hidden" />
          <Button x:Name="cReset" Content="R" Height="10" Width="30" Margin="35,0,0,0" Click="cReset_Click"/>
      </StackPanel>
      

      代码附加信息:

       public class BlendModeEffect : ShaderEffect
          {
              public BlendModeEffect()
              {
                  UpdateShaderValue(InputProperty);
                  UpdateShaderValue(TextureProperty);
              }
      
              public Brush Input
              {
                  get { return (Brush)GetValue(InputProperty); }
                  set { SetValue(InputProperty, value); }
              }
              public static readonly DependencyProperty InputProperty =
                  ShaderEffect.RegisterPixelShaderSamplerProperty
                  (
                      "Input",
                      typeof(BlendModeEffect),
                      0
                  );
      
              public Brush Texture
              {
                  get { return (Brush)GetValue(TextureProperty); }
                  set { SetValue(TextureProperty, value); }
              }
              public static readonly DependencyProperty TextureProperty =
                  ShaderEffect.RegisterPixelShaderSamplerProperty
                  (
                      "Texture",
                      typeof(BlendModeEffect),
                      1
                  );
          }
      //Contrast, Brightness, CMY & RGB Effect
        public class BrightContrastEffect : ShaderEffect
          {
              private static PixelShader m_shader =
                  new PixelShader() { UriSource = MakePackUri("bricon.ps") };
      
              public BrightContrastEffect()
              {
      
      
                  PixelShader = m_shader;
                  UpdateShaderValue(InputProperty);
                  UpdateShaderValue(BrightnessProperty);
                  UpdateShaderValue(ContrastProperty);
                  UpdateShaderValue(RedProperty);
                  UpdateShaderValue(GreenProperty);
                  UpdateShaderValue(BlueProperty);
      
              }
      
              // MakePackUri is a utility method for computing a pack uri 
              // for the given resource.  
              public static Uri MakePackUri(string relativeFile)
              {
                  Assembly a = typeof(BrightContrastEffect).Assembly;
      
                  // Extract the short name. 
                  string assemblyShortName = a.ToString().Split(',')[0];
      
                  string uriString = "pack://application:,,,/" +
                      assemblyShortName +
                      ";component/" +
                      relativeFile;
      
                  return new Uri(uriString);
              }
      
              public Brush Input
              {
                  get { return (Brush)GetValue(InputProperty); }
                  set { SetValue(InputProperty, value); }
              }
      
              public static readonly DependencyProperty InputProperty = ShaderEffect.RegisterPixelShaderSamplerProperty("Input", typeof(BrightContrastEffect), 0);
      
              public float Brightness
              {
                  get { return (float)GetValue(BrightnessProperty); }
                  set { SetValue(BrightnessProperty, value); }
              }
      
              public static readonly DependencyProperty BrightnessProperty = DependencyProperty.Register("Brightness", typeof(double), typeof(BrightContrastEffect), new UIPropertyMetadata(0.0, PixelShaderConstantCallback(0)));
      
              public float Contrast
              {
                  get { return (float)GetValue(ContrastProperty); }
                  set { SetValue(ContrastProperty, value); }
              }
      
              public static readonly DependencyProperty ContrastProperty = DependencyProperty.Register("Contrast", typeof(double), typeof(BrightContrastEffect), new UIPropertyMetadata(0.0, PixelShaderConstantCallback(1)));
      
      
              public float Red
              {
                  get { return (float)GetValue(RedProperty); }
                  set { SetValue(RedProperty, value); }
              }
      
              public static readonly DependencyProperty RedProperty = DependencyProperty.Register("Red", typeof(double), typeof(BrightContrastEffect), new UIPropertyMetadata(0.0, PixelShaderConstantCallback(2)));
      
              public float Green
              {
                  get { return (float)GetValue(GreenProperty); }
                  set { SetValue(RedProperty, value); }
              }
      
              public static readonly DependencyProperty GreenProperty = DependencyProperty.Register("Green", typeof(double), typeof(BrightContrastEffect), new UIPropertyMetadata(0.0, PixelShaderConstantCallback(3)));
      
              public float Blue
              {
                  get { return (float)GetValue(BlueProperty); }
                  set { SetValue(BlueProperty, value); }
              }
      
              public static readonly DependencyProperty BlueProperty = DependencyProperty.Register("Blue", typeof(double), typeof(BrightContrastEffect), new UIPropertyMetadata(0.0, PixelShaderConstantCallback(4)));
      
              //private static PixelShader m_shader = new PixelShader() { UriSource = new Uri(@"pack://application:,,,/CustomPixelRender;component/bricon.ps") };
      
          }
      
      //Average Blend Mode Effect
       public class AverageEffect : BlendModeEffect
          {
              public static Uri MakePackUri(string relativeFile)
              {
                  Assembly a = typeof(ColorBurnEffect).Assembly;
      
                  // Extract the short name. 
                  string assemblyShortName = a.ToString().Split(',')[0];
      
                  string uriString = "pack://application:,,,/" +
                      assemblyShortName +
                      ";component/" +
                      relativeFile;
      
                  return new Uri(uriString);
              }
              static AverageEffect()
              {
                  _pixelShader.UriSource = MakePackUri("AverageEffect.ps");
              }
      
              public AverageEffect()
              {
                  this.PixelShader = _pixelShader;
              }
      
              private static PixelShader _pixelShader = new PixelShader();
          }
      
      //ColorBurn Effect
        public class ColorDodgeEffect : BlendModeEffect
          {
              public static Uri MakePackUri(string relativeFile)
              {
                  Assembly a = typeof(ColorBurnEffect).Assembly;
      
                  // Extract the short name. 
                  string assemblyShortName = a.ToString().Split(',')[0];
      
                  string uriString = "pack://application:,,,/" +
                      assemblyShortName +
                      ";component/" +
                      relativeFile;
      
                  return new Uri(uriString);
              }
              static ColorDodgeEffect()
              {
                  _pixelShader.UriSource = MakePackUri("ColorDodgeEffect.ps");
              }
      
              public ColorDodgeEffect()
              {
                  this.PixelShader = _pixelShader;
              }
      
              private static PixelShader _pixelShader = new PixelShader();
          }
      
      //BlendModeEffect
        public class BlendModeEffect : ShaderEffect
          {
              public BlendModeEffect()
              {
                  UpdateShaderValue(InputProperty);
                  UpdateShaderValue(TextureProperty);
              }
      
              public Brush Input
              {
                  get { return (Brush)GetValue(InputProperty); }
                  set { SetValue(InputProperty, value); }
              }
              public static readonly DependencyProperty InputProperty =
                  ShaderEffect.RegisterPixelShaderSamplerProperty
                  (
                      "Input",
                      typeof(BlendModeEffect),
                      0
                  );
      
              public Brush Texture
              {
                  get { return (Brush)GetValue(TextureProperty); }
                  set { SetValue(TextureProperty, value); }
              }
              public static readonly DependencyProperty TextureProperty =
                  ShaderEffect.RegisterPixelShaderSamplerProperty
                  (
                      "Texture",
                      typeof(BlendModeEffect),
                      1
                  );
          }
      

1 个答案:

答案 0 :(得分:0)

根据SO聊天使用建议。我已将 BrightContrastEffect 称为滑块更改事件处理程序中图像的新效果。我以编程方式设置了招标价值。

private void cVal_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
   cColorEffects.SelectedIndex = 0;
   BrightContrastEffect bce = new BrightContrastEffect();
   BindingOperations.SetBinding(bce, BrightContrastEffect.ContrastProperty, new        Binding("Value") { Source = cVal });
ViewedPhoto.Effect = bce;
}

我已经应用了与其他滑块相同的方法。