Как привязать элемент управления Image к изображению, которое сохраняется в базе данных в типе VarBinary - PullRequest
1 голос
/ 27 июля 2011

Я хочу связать изображение, которое сохраняется в varbinary типе в базе данных в XAML. Как я могу это сделать?

например, поле изображения в базе данных Northwind.

спасибо

РЕДАКТИРОВАТЬ 1:)

Я пишу эти коды для поля преобразования изображения (Поле изображения в таблице категорий в базе данных Northwind), но каждый раз, когда я получаю исключение:

class ImageConverter : IValueConverter
{
    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null) { return null; }

        var image = (System.Drawing.Image)value;
        var bitmap = new System.Windows.Media.Imaging.BitmapImage();
        bitmap.BeginInit();
        MemoryStream memoryStream = new MemoryStream();
        image.Save(memoryStream, ImageFormat.Bmp);
        memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
        bitmap.StreamSource = memoryStream;
        bitmap.EndInit();
        return bitmap;

    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new Exception("The method or operation is not implemented.");
    }
}

А:

class ImageConverter : IValueConverter
{
    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null && value is byte[])
        {
            byte[] bytes = value as byte[];
            MemoryStream stream = new MemoryStream(bytes);
            BitmapImage image = new BitmapImage();
            image.BeginInit();
            image.StreamSource = stream;
            image.EndInit();
            return image;
        }
        return null;
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new Exception("The method or operation is not implemented.");
    }
}

и исключение:

Provide value on 'System.Windows.Markup.StaticResourceHolder' threw an exception.

Ответы [ 2 ]

4 голосов
/ 27 июля 2011

Если вы получаете байтовый массив из базы данных, тогда нет необходимости преобразовывать его в изображение или растровое изображение ... Вы можете связать свойство Source изображения с байтовым массивом. Wpf внутренне обрабатывает байтовый массив и преобразует байтовый массив в изображение...

Редактировать:

Если вы все еще хотите преобразовать байтовый массив в растровое изображение, вот метод, который был протестирован

public BitmapImage ImageFromBytearray(byte[] imageData)
        {

            if (imageData == null)
                return null;
            MemoryStream strm = new MemoryStream();
            strm.Write(imageData, 0, imageData.Length);
            strm.Position = 0;
            System.Drawing.Image img = System.Drawing.Image.FromStream(strm);

            BitmapImage bitmapImage = new BitmapImage();
            bitmapImage.BeginInit();
            MemoryStream memoryStream = new MemoryStream();
            img.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);
            memoryStream.Seek(0, SeekOrigin.Begin);
            bitmapImage.StreamSource = memoryStream;
            bitmapImage.EndInit();

            return bitmapImage;
        }

Я создал образец, используя вышеуказанный метод ...

Код Xaml:

<Window x:Class="WpfApplication1.ImageFromByteArray"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ImageFromByteArray" Height="300" Width="300" Name="Root">
    <Grid>
        <Image Source="{Binding ImageSource,ElementName=Root}" Height="300" Width="300"  RenderOptions.BitmapScalingMode="HighQuality"/>
    </Grid>
</Window>

Код, стоящий за

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.IO;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for ImageFromByteArray.xaml
    /// </summary>
    public partial class ImageFromByteArray : Window
    {


        public byte[] ByteArray
        {
            get
            {
                return (byte[])GetValue(ByteArrayProperty);
            }
            set
            {
                SetValue(ByteArrayProperty, value);
            }
        }

        // Using a DependencyProperty as the backing store for ByteArray.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ByteArrayProperty =
            DependencyProperty.Register("ByteArray", typeof(byte[]), typeof(ImageFromByteArray));



        public BitmapImage ImageSource
        {
            get { return (BitmapImage)GetValue(ImageSourceProperty); }
            set { SetValue(ImageSourceProperty, value); }
        }

        // Using a DependencyProperty as the backing store for ImageSource.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ImageSourceProperty =
            DependencyProperty.Register("ImageSource", typeof(BitmapImage), typeof(ImageFromByteArray), new UIPropertyMetadata(null));


        public ImageFromByteArray()
        {
            InitializeComponent();
            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
            if (dlg.ShowDialog().GetValueOrDefault())
            {
                FileStream fs = new FileStream(dlg.FileName, FileMode.Open, FileAccess.Read);
                ByteArray = new byte[fs.Length];
                fs.Read(ByteArray, 0, System.Convert.ToInt32(fs.Length));
                fs.Close();
                ImageSource = ImageFromBytearray(ByteArray);
            }
        }


        public BitmapImage ImageFromBytearray(byte[] imageData)
        {

            if (imageData == null)
                return null;
            MemoryStream strm = new MemoryStream();
            strm.Write(imageData, 0, imageData.Length);
            strm.Position = 0;
            System.Drawing.Image img = System.Drawing.Image.FromStream(strm);

            BitmapImage bitmapImage = new BitmapImage();
            bitmapImage.BeginInit();
            MemoryStream memoryStream = new MemoryStream();
            img.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);
            memoryStream.Seek(0, SeekOrigin.Begin);
            bitmapImage.StreamSource = memoryStream;
            bitmapImage.EndInit();

            return bitmapImage;
        }
    }
}

Надеюсь, это поможет вам ...

0 голосов
/ 27 июля 2011

Это может быть достигнуто только с помощью пользовательского конвертера. Посмотрите на this для деталей о том, как реализовать часть "изображения", и здесь для деталей о создании конвертера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...