Нужен простой конвертер byte[] to Image WPF

107
28 августа 2019, 12:40

Есть бд MSSQL в ней таблица в которой в поле Logo типа Image хранятся изображения формата jpeg(да, я знаю что так делать не есть хорошо но у меня такое тз). В шарпе работаю c LINQ. Крч мне нужно вывести картинку в элемент Image. Для этого нужен конвертер byte[] to Image, а всё что гуглил огромное и страшное. Если у вас есть какие либо конвертеры покидайте пожалуйста (преимущественно интересуют элегантные и простые решения, но можно покидать и простые народные). Буду очень благодарен. Раньше на винформах юзал вот такое:

public static Image byteArrToImage(byte[] byteArr)
{
MemoryStream ms = new MemoryStream(byteArr);
Image pict = Image.FromStream(ms);
return pict
}
Answer 1

Ну например так:

class FromBytesExtension : MarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!(value is byte[] bytes) || LicenseManager.UsageMode == LicenseUsageMode.Designtime)
            return null;
        var image = new BitmapImage();
        using (var mem = new MemoryStream(bytes))
        {
            mem.Position = 0;
            image.BeginInit();
            image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.UriSource = null;
            image.StreamSource = mem;
            image.EndInit();
        }
        image.Freeze();
        return image;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        => throw new NotImplementedException();
    public override object ProvideValue(IServiceProvider serviceProvider) => this;
}

Само преобразование взял c EnSO.

Пару пояснений:

  • value is byte[] bytes - проверяем на тип входных данных, если не byte[], то возвращаем null.
  • LicenseManager.UsageMode == LicenseUsageMode.Designtime - Запрещаем дизайнеру Vusial Studio работать с этим классом, возвращая при этом null.

Также хочу заметить, что тут используется MarkupExtension, который в данном случае позволяет просто не делать нудный ресурс конвертера. Можете смело от него отказаться, но не забудьте добавить ресурс в XAML.

Использование:

<Image Source="{Binding Bytes, Converter={cw:FromBytes}}"/>
READ ALSO
WPF + ссылка на сайт кнопкой

WPF + ссылка на сайт кнопкой

Столкнулся с проблемой в создании ссылки на определенный сайт с помощью кнопки в WPF, можно ли вообще её как-нибудь сделать, или нет? Если можно,...

129
Отправляемые данные ajax post запросом

Отправляемые данные ajax post запросом

Есть модельС формы отправляется ajax запросом несколько полей с такими же названиями как и у свойств модели

119
Изменение цвета кнопки трекбаром через Color.FromArgb C#

Изменение цвета кнопки трекбаром через Color.FromArgb C#

Необходимо правильно масштабировать ползунокЗадача следующая, при перемещении ползунка с диапазоном от 0 до 10 необходимо менять цвет кнопки

140
Что за параметр &ldquo;connection&rdquo;?

Что за параметр “connection”?

При попытке обновления базы данных, получаю вот такую ошибку в диспетчере пакетов

132