/// <summary>
/// Hilft beim Ausgrauen von Bildern anhand eines boolischen Wertes (oder eines invertierten boolischen Wertes) (unterstützt Alphakanäle).
/// </summary>
public static class GrayScaleImage
{
/// <summary>
/// Die Bildquelle.
/// </summary>
public static readonly DependencyProperty SourceProperty = DependencyProperty.RegisterAttached("Source", typeof(ImageSource), typeof(GrayScaleImage), new PropertyMetadata(default(ImageSource), propChanged));
public static readonly DependencyProperty IsGrayscaledProperty = DependencyProperty.RegisterAttached("IsGrayscaled", typeof(bool), typeof(GrayScaleImage), new PropertyMetadata(true, propChanged));
public static readonly DependencyProperty IsGrayscaledInvertedProperty = DependencyProperty.RegisterAttached("IsGrayscaledInverted", typeof(bool), typeof(GrayScaleImage), new PropertyMetadata(false, propChanged));
private static bool byCode;
/// <summary>
/// Liefert dei Bildquelle.
/// </summary>
public static ImageSource GetSource(Image d)
{
return (ImageSource)d.GetValue(SourceProperty);
}
/// <summary>
/// Legt die Bildquelle fest.
/// </summary>
public static void SetSource(Image d, ImageSource source)
{
d.SetValue(SourceProperty, source);
}
/// <summary>
/// Gibt an, ob das Quellbild ausgegraut werden soll.
/// </summary>
public static bool GetIsGrayscaled(Image d)
{
return (bool)d.GetValue(IsGrayscaledProperty);
}
/// <summary>
/// Gibt an, ob das Quellbild ausgegraut werden soll.
/// </summary>
public static void SetIsGrayscaled(Image d, bool source)
{
d.SetValue(IsGrayscaledProperty, source);
}
/// <summary>
/// Gibt an, ob das Quellbild ausgegraut werden soll bei invertierten Wert.
/// </summary>
public static bool GetIsGrayscaledInverted(Image d)
{
return (bool)d.GetValue(IsGrayscaledInvertedProperty);
}
/// <summary>
/// Gibt an, ob das Quellbild ausgegraut werden soll bei invertierten Wert.
/// </summary>
public static void SetIsGrayscaledInverted(Image d, bool source)
{
d.SetValue(IsGrayscaledInvertedProperty, source);
}
/// <summary>
/// Ausgrauen des Bildes.
/// </summary>
private static void propChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.Property == IsGrayscaledInvertedProperty && !byCode)
{
byCode = true;
SetIsGrayscaled((Image)d, !(bool)e.NewValue);
byCode = false;
}
else if (e.Property == IsGrayscaledProperty && !byCode)
{
byCode = true;
SetIsGrayscaledInverted((Image)d, !(bool)e.NewValue);
byCode = false;
}
var isGray = GetIsGrayscaled((Image)d);
var source = GetSource((Image)d);
var owner = d as Image;
if (owner != null)
{
if (isGray && source != null)
{
// Ausgrauen!
owner.Source = null;
owner.Source = BitmapHelper.ConvertImageToGrayScaleImage(source);
owner.OpacityMask = null;
owner.OpacityMask = new ImageBrush(source);
}
else
{
owner.Source = null;
owner.Source = source;
owner.OpacityMask = null;
}
}
}
}
public static class BitmapHelper
{
/// <summary>
/// Ändert das Pixelformat nach Gray16.
/// <para>Hinweis: Um bei PNG Transparenzen zu erhalten, ist erforderlich OpacityMask mit dem Quellbild zu setzen.</para>
/// </summary>
public static ImageSource ConvertImageToGrayScaleImage(ImageSource source)
{
// Attention to the comment above.
var grayBitmap = new FormatConvertedBitmap();
grayBitmap.BeginInit();
grayBitmap.Source = (BitmapSource)source;
grayBitmap.DestinationFormat = PixelFormats.Gray16;
grayBitmap.EndInit();
return grayBitmap;
}
}