文章的内容是来自微软中文技术论坛的一个帖子,当时是想将一段将图片灰度处理的代码转换为XAML的一个样式,在这里要谢谢html
Xiao Yan Qiang、Sheldon _Xiao、shixin的热情回答,如今将他们的回答贴出来供你们学习参考.内容以下:post
提问: 这个功能如何写成一个样式,将一个窗体内全部的Image控件的图片格式都转换为Gray8学习
BitmapImage bitmapImage = new BitmapImage(new Uri("D:\\Face.jpg"));
FormatConvertedBitmap newFormatedBitmapSource = new FormatConvertedBitmap();
newFormatedBitmapSource.BeginInit();
newFormatedBitmapSource.Source = bitmapImage;
newFormatedBitmapSource.DestinationFormat = PixelFormats.Gray8;
newFormatedBitmapSource.EndInit();
img.Source = newFormatedBitmapSource;
this.Content = img;this
Xiao Yan Qiang的回答: spa
public class ImageAttached { // Gray8附加属性,Gary8图片样式的"开关"
public static readonly DependencyProperty Gray8Property = DependencyProperty.RegisterAttached("Gray8", typeof(bool), typeof(ImageAttached), new FrameworkPropertyMetadata((bool)false, new PropertyChangedCallback(OnGray8Changed))); public static bool GetGray8(DependencyObject d) { return (bool)d.GetValue(Gray8Property); } public static void SetGray8(DependencyObject d, bool value) { d.SetValue(Gray8Property, value); } private static void OnGray8Changed(DependencyObject d, DependencyPropertyChangedEventArgs e) { Image currentImage = d as Image; if (currentImage == null) { return; } bool isGray8 = (bool)d.GetValue(Gray8Property); if (isGray8) { // 附加BitmapSourceBackup属性,备份当前BitmapSource,以备恢复用
BitmapSource backupBitmapSource = (currentImage.Source as BitmapSource).CloneCurrentValue(); d.SetValue(BitmapSourceBackupProperty, backupBitmapSource); // 创建Gray8的BitmapSource
FormatConvertedBitmap newFormatedBitmapSource = new FormatConvertedBitmap(); newFormatedBitmapSource.BeginInit(); newFormatedBitmapSource.Source = currentImage.Source as BitmapSource; newFormatedBitmapSource.DestinationFormat = PixelFormats.Gray8; newFormatedBitmapSource.EndInit(); // 替换ImageSource
currentImage.Source = newFormatedBitmapSource; } else { // 图像恢复操做
object obj = currentImage.GetValue(BitmapSourceBackupProperty); if (obj == null) { return; } BitmapSource bs = obj as BitmapSource; if (bs == null) { return; } currentImage.Source = bs; } } // 备份用源图像的附加属性,当Gray8变动时,自动附加
public static readonly DependencyProperty BitmapSourceBackupProperty = DependencyProperty.RegisterAttached("BitmapSourceBackup", typeof(BitmapSource), typeof(ImageAttached), new FrameworkPropertyMetadata(null)); public static BitmapSource GetBitmapSourceBackup(DependencyObject d) { return (BitmapSource)d.GetValue(BitmapSourceBackupProperty); } public static void SetBitmapSourceBackup(DependencyObject d, BitmapSource value) { d.SetValue(BitmapSourceBackupProperty, value); } }
而后XAML里添加 local:ImageAttached.Gray8="True"
<Image xmlns:local="clr-namespace:WpfImageGray8Sample" Source="/WpfImageGray8Sample;component/Images/44537119.jpg" local:ImageAttached.Gray8="True" />
这样就能够方便控制Gray8了。
Sheldon _Xiao
的回答:code
推荐了一个连接: http://www.rikware.com/post/Setting-FormatConvertedBitmap-Source-via-Binding.aspx
里面也是用转换器实现
shixin的回答:component
<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:y="clr-namespace:WpfApplication1" Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<y:GrayImage x:Key="GrayImage" />
</Window.Resources>
<Grid>
<Image Source="{Binding RelativeSource={RelativeSource Self}, Path=Tag, Converter={StaticResource GrayImage}}" Tag="C:\Test.jpg" />
</Grid>
</Window>
orm
xaml部分还能够写成这样xml
<Window.Resources>
<y:GrayImage x:Key="GrayImage" />
<Style TargetType="{x:Type Image}">
<Setter Property="Source" Value="{Binding RelativeSource={RelativeSource Self}, Path=Tag, Converter={StaticResource GrayImage}}" />
</Style>
</Window.Resources>
<Grid>
<Image Tag="C:\Test.jpg" />
</Grid>
htm
Public Class GrayImage Implements IValueConverter Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As Globalization.CultureInfo) As Object Implements IValueConverter.Convert Try Dim newFormatedBitmapSource As New FormatConvertedBitmap newFormatedBitmapSource.BeginInit() newFormatedBitmapSource.Source = New BitmapImage(New Uri(value.ToString)) newFormatedBitmapSource.DestinationFormat = PixelFormats.Gray8 newFormatedBitmapSource.EndInit() Convert = newFormatedBitmapSource Catch Convert = Nothing End Try End Function Public Function ConvertBack(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack ConvertBack = value End Function End Class
再次的谢谢他们…