как вставить изображение в базу данных с помощью WPF - PullRequest
6 голосов
/ 25 февраля 2010

У меня вопрос к WPF.

У меня есть 2 текстовых поля и элемент управления изображением в форме WPF. Элемент управления изображением содержит изображение.

Я хочу вставить содержимое каждого из текстовых полей и изображения в 3 отдельных столбца в базе данных SQL. Текстовые поля подаются в столбцы varchar, а само изображение загружается в столбец с изображением типа данных.

Как я могу это сделать?

Спасибо

Ответы [ 5 ]

4 голосов
/ 28 февраля 2010

То, как мы это делаем, заключается в том, чтобы хранить изображения в виде BLOB-объектов в базе данных (это довольно маленькие изображения, 4-500 КБ, поэтому их хранение в БД не должно вызывать проблем с перфорированием), извлекать их как байтовые массивы и затем используйте ValueConverter для преобразования из byte[] в BitMap. XAML для управления изображением выглядит так:

<Image Source="{Binding Path=RawImageData, 
                        Converter={StaticResource ByteArrayToBitmapImageConverter},
                        Mode=OneWay}" />

Свойство, с которым мы связываемся во ViewModel, просто byte[], как это;

private byte[] _rawImageData;
public byte[] RawImageData
{
    get { return _rawImageData; }
    set
    {
        if (value != _rawImageData)
        {
            _rawImageData = value;
            NotifyPropertyChanged("RawImageData");
        }
    }
}

И тогда ValueConverte выглядит так;

    public class ByteArrayToBitmapImageConverter : IValueConverter
    {
      public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
      {
        var rawImageData = value as byte[];
        if (rawImageData == null)
          return null;

        var bitmapImage = new System.Windows.Media.Imaging.BitmapImage();
        using (var stream = new MemoryStream(rawImageData))
        {
          bitmapImage.BeginInit();
          bitmapImage.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
          bitmapImage.CacheOption = BitmapCacheOption.Default;
          bitmapImage.StreamSource = stream;
          bitmapImage.EndInit();
        }
        return bitmapImage;
      }

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
     {
       throw new NotImplementedException();
     }
   }
1 голос
/ 31 октября 2013

Ниже описан способ хранения / получения изображений в базе данных с использованием Linq to SQL в WPF.

База данных

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

CREATE TABLE UploadedImage(
 [ImageID] [int] IDENTITY(1,1) NOT NULL,
 [ImageName] [varchar](100) NOT NULL,
 [ImageContent] [image] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Уровень доступа к данным с использованием Linq 2 SQL

В Visual Studio добавьте новый элемент типа LINQ to SQL Classes (.dbml) и назовем его MyDataContext. Используйте Server Explorer в VS, подключитесь к вашей базе данных и перетащите таблицу ваших изображений UploadedImage в область дизайна .dbml. Сохраните файл MyDataContext Ctrl + S .

XAML

<TextBox x:Name="ImagePath" />
<Button x:Name="BrowseButton" Content="..." Click="BrowseButton_OnClick"/>
<Button x:Name="SaveButton" Content="Save" Click="SaveButton_OnClick"/>
<Button x:Name="LoadButton" Content="Load" Click="LoadButton_OnClick" />
<Image x:Name="MyImage" >
    <Image.Source>
        <BitmapImage UriSource="{Binding ElementName=ImagePath, Path=Text}" />
    </Image.Source>
</Image>

Код позади

private byte[] _imageBytes = null;

// Browse for an image on your computer
private void BrowseButton_OnClick(object sender, RoutedEventArgs e)
{
    var dialog = new OpenFileDialog
    {
        CheckFileExists = true,
        Multiselect = false,
        Filter = "Images (*.jpg,*.png)|*.jpg;*.png|All Files(*.*)|*.*"
    };

    if (dialog.ShowDialog() != true) { return; }

    ImagePath.Text = dialog.FileName;
    MyImage.Source = new BitmapImage(new Uri(lImagePath.Text));

    using (var fs = new FileStream(ImagePath.Text, FileMode.Open, FileAccess.Read))
    {
        _imageBytes = new byte[fs.Length];
        fs.Read(imgBytes, 0, System.Convert.ToInt32(fs.Length));
    }
}

// Save the selected image to your database
private void SaveButton_OnClick(object sender, RoutedEventArgs e)
{
    if (!String.IsNullOrEmpty(ImagePath.Text))
    {
        var db = new MyDataContext();
        var uploadedImg = new UploadedImage
        {
            ImageID = 0,
            ImageContent = _imageBytes,
            ImageName = ImagePath.Text
        };

        db.UploadedImages.InsertOnSubmit(uploadedImg);
        db.SubmitChanges();
    }
}

// Load an image from the database
private void LoadButton_OnClick(object sender, RoutedEventArgs e)
{
    // Load 1 image from the database and display it
    var db = new ImageInDatabaseDataContext();
    var img = (from el in db.UploadedImages
        select el).FirstOrDefault();


    if (img != null)
    {
        // Display the loaded image
        ImageFile.Source = new BitmapImage(new Uri(img.ImageName));
    }
}
0 голосов
/ 25 февраля 2010

Я не уверен, как работает тип поля изображения, однако это может быть полезно:

Image UriSource и привязка данных

Другими словами, вам может потребоваться использовать преобразователь значений для преобразования в / из вашего формата БД в формат вашей презентации (WPF).

0 голосов
/ 26 февраля 2010

Если вы хотите обрабатывать изображения BitmapSource, включая случаи, когда источники изображений не являются файлами, то я рекомендую скопировать буфер пикселей в массив , затем сохранить метаданные массива + pixelformat и размеры массив и метаданные можно использовать для воссоздания изображения ).

0 голосов
/ 25 февраля 2010

make 2 table, первая таблица содержит текст textbox1 [возможно, «имя»], текст textbox2 [возможно, «фамилию»] и imageId [], другая таблица содержит идентификатор файла, байты файла и расширения файла. Когда вы сохраняете вышеупомянутую информацию с картина. взять байты изображения и расширения сохранить это. когда вы заставляете изображение порядка показывать где-то, вы переводите байт в файл через его расширение http://www.beansoftware.com/ASP.NET-Tutorials/Save-Read-Image-Database.aspx здесь для ASP.NET, но элементы управления, как правило, одинаковы для .net. (textbox.Text и т. д.)

private void Button1_Click(object sender, System.EventArgs e)
{
 Stream img_strm = upload_file.PostedFile.InputStream;

//Retrieving the length of the file to upload
int img_len = upload_file.PostedFile.ContentLength;
//retrieving the type of the file to upload
string strtype = upload_file.PostedFile.ContentType.ToString();
string strname = txtimgname.Text.ToString();
byte[] imgdata = new byte[img_len];
int n = img_strm.Read(imgdata, 0, img_len);
int result = SaveToDB(strname, imgdata, strtype);}
...