Сохранение изображений в базе данных Access в WPF и C#
Пример
Когда вы выбираете книгу из ListBox, а затем нажмите кнопку «Установить изображение», выполняется следующий код.
// Установите изображение для этого заголовка. private void btnSetImage_Click(object sender, RoutedEventArgs e) { OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter = "Image files|*.bmp;*.jpg;*.gif;*.png;*.tif|All files|*.*"; dlg.FilterIndex = 1; if (dlg.ShowDialog() == true) { try { // Отображение изображения. BitmapImage bm = new BitmapImage(new Uri(dlg.FileName)); imgCover.Source = bm; // Установите изображение в базе данных. // Поле CoverImage имеет тип OLE Object. string title = lstTitles.SelectedItem.ToString().Replace("'", "''"); OleDbCommand cmd = new OleDbCommand( "UPDATE Books SET CoverImage=@Image WHERE Title='" + title + "'", Conn); // Создаем массив байтов, содержащий изображение. byte[] image_bytes = ImageToBytes(bm); // Добавьте изображение в качестве параметра. OleDbParameter param = new OleDbParameter(); param.OleDbType = OleDbType.Binary; param.ParameterName = "Image"; param.Value = image_bytes; cmd.Parameters.Add(param); // Выполнить команду (без возвращаемого значения). cmd.Connection = Conn; Conn.Open(); cmd.ExecuteScalar(); } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { if (Conn.State != ConnectionState.Closed) Conn.Close(); } } }
Этот код начинается с создания OpenFileDialog, устанавливая его свойства Filter и FilterIndex и отображая диалог. Если пользователь выбирает файл, метод создает BitmapImage из файла и отображает его в элементе управления imgCover Image.
Далее код создает инструкцию SQL INSERT для обновления изображения выбранного заголовка. Он вызывает метод ImageToBytes (описанный в скором времени) для преобразования BitmapImage в массив байтов и создает объект параметра для байтов. Затем он вызывает метод ExecuteScalar команды для обновления записи.
В следующем коде показан способ ImageToBytes.
// Преобразование BitmapImage в массив байтов. private static byte[] ImageToBytes(BitmapImage image) { byte[] data; JpegBitmapEncoder encoder = new JpegBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(image)); using (MemoryStream ms = new MemoryStream()) { encoder.Save(ms); data = ms.ToArray(); } return data; }
Этот метод создает объект JpegBitmapEncoder для кодирования растрового изображения в виде данных JPEG. Он добавляет кадр в кодировщик для представления изображения. Затем он создает MemoryStream и вызывает метод Сохранить кодера, чтобы заставить его записывать свои данные в MemoryStream. Наконец, код вызывает метод MemoryStream ToArray для преобразования данных в массив байтов, который возвращает метод.