Конвертор на ImageSource - конвертировать изображение в оттенки серого - PullRequest
4 голосов
/ 17 января 2011

У меня есть мульти-привязка по управлению изображениями.Я связываю два свойства, одно - это тип bool (IsLogged), а другое - typeof Uri (ProfilePhoto).

XAML:

                                <Image.Source >
                                    <MultiBinding Converter="{StaticResource avatarConverter}">
                                        <Binding Path="ProfilePhoto"></Binding>
                                        <Binding Path="StatusInfo.IsLogged"></Binding>
                                    </MultiBinding>
                                </Image.Source>
                            </Image>

Я создаю конвертер, который преобразует BitmapImage в оттенки серого, если свойствоIsLogged имеет значение false.

Это выглядит следующим образом:

public class AvatarConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var image = values[0] as BitmapImage;

        string s = values[1].ToString();

        bool isLogged = System.Convert.ToBoolean(s);

        if (!isLogged)
        {
            try
            {
                if (image != null)
                {
                    var grayBitmapSource = new FormatConvertedBitmap();
                    grayBitmapSource.BeginInit();
                    grayBitmapSource.Source = image;
                    grayBitmapSource.DestinationFormat = PixelFormats.Gray32Float;
                    grayBitmapSource.EndInit();
                    return grayBitmapSource;
                }
                return null;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        return image;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Это работает хорошо, если только я связываюсь с типом свойства источника изображения для BitmapImage, но мне нужно связать тип свойства Uri.

У меня есть страх перед созданием переменной BitmapImage в конвертере и в качестве источника использовать Uri.Возврат этой переменной в качестве источника изображения.Я думаю, что это не идеальный способ.Может быть, я ошибаюсь.

Каково ваше мнение

Какое-то элегантное решение?

1 Ответ

11 голосов
/ 17 января 2011

Хотя вы можете сделать это с помощью конвертера, есть гораздо лучший вариант: использовать эффект шейдера.Вы найдете реализацию GreyscaleEffect на этой странице .

<Style x:Key="grayedIfNotLogged" TargetType="Image">
    <Style.Triggers>
        <DataTrigger Binding="{Binding StatusInfo.IsLogged}" Value="False">
            <Setter Property="Effect">
                <Setter.Value>
                    <fx:GrayscaleEffect />
                </Setter.Value>
            </Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>

...

<Image Source="..." Style="{StaticResource grayedIfNotLogged}" />
...