WPF 圖片灰度處理

原文: WPF 圖片灰度處理

文章的內容是來自微軟中文技術論壇的一個帖子,當時是想將一段將圖片灰度處理的代碼轉換爲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

 

 

再次的謝謝他們…