Feedback

C# - Xaml Png-Bild: Farben entfernen und Transparanz behalten

Veröffentlicht von am 6/17/2014
(0 Bewertungen)
Enfernt von einem Bild die Farben und behält die Transparanz bei (Png tauglich).

Anwendungsbeispiel (Xaml)
[ImageSource] ist ein Platzhalter für die Bildquelle (Typ: ImageSource)

<Image attachedProperties:GrayScaleImage.IsGrayscaledInverted="{TemplateBinding IsEnabled}"
attachedProperties:GrayScaleImage.Source="{Binding Path=[ImageSource]}" />
/// <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;
	}
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!