Заливка и извлечение изображений из базы sqlite на C#
Так интересно совпало, что я сейчас одновременно работаю над двумя очень похожими проектами. Одно из похожих их свойств – это хранение данных в базе sqlite. И в этом материале я расскажу вам, как заливать в данную базу картинки, а также извлекать и отображать без потери качества.
Как подключать sqlite к проекту C#, мы научились, теперь научимся остальному. Мы в прошлых проектах напрямую закидывали переменные в базу, без приведения типов, надеясь, что там все само разберется. Очень часто это так и есть, но для вообще такой вариант подходит больше для отладки, нежели для релизной программы.
Итак, кидаем на форму кнопку и элемент picturebox, даем ему имя, к примеру, pbFoto. Также добавляем элемент openFileDialog1. По нажатию кнопки должен у нас выполняться вот такой код:
private void button3_Click(object sender, EventArgs e) { openFileDialog1.Filter = "JPEG файлы (*,.jpg)|*.jpg|Bitmap файлы (*.bmp)|*.bmp|Все файлы (*.*)|*.*"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { pbFoto.ImageLocation = openFileDialog1.FileName; } }То есть мы выбираем файл с нужным фильтром, затем изменяем свойство ImageLocation – чтобы картинка отобразилась в элементе. Далее интересный момент. Нам надо это изображение перевести в массив байт и засунуть в базу. Если мы возьмем этот же ImageLocation и проведем вот такую операцию:
byte[] bData = File.ReadAllBytes(pbFoto.ImageLocation); File.WriteAllBytes(pbFoto.ImageLocation, bData);То массив байт мы получим и сможем его залить в базу. Однако, качество изображения у данного способа будет неважным. Поэтому мы пойдем другим способом. Добавим метод:
public byte[] imageToByteArray(System.Drawing.Image imageIn) { MemoryStream ms = new MemoryStream(); imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); return ms.ToArray(); }И используем его так:
byte[] bData = imageToByteArray(pbFoto.Image);Далее вставляем картинку в базу по букварю, а не как мы делали раньше:
using (SQLiteCommand command = new SQLiteCommand(m_dbConn)) { command.CommandText = "insert into Chapter (id, img) VALUES (@id, @img)"; command.Parameters.Add("@id", DbType.Int32).Value = 4; command.Parameters.Add("@img", DbType.Binary).Value = bData; command.ExecuteNonQuery(); }Извлекаем вот так:
m_sqlCmd.CommandText = "SELECT * FROM Chapter WHERE id ='" + id + "'"; try { SQLiteDataReader r = m_sqlCmd.ExecuteReader(); r.Read(); MemoryStream stmBLOBData = new MemoryStream((byte[])r["img"]); pbFoto.Image = Image.FromStream(stmBLOBData); pbFoto.Refresh(); r.Close(); r.Dispose(); } catch (SQLiteException ex) { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); }Все просто, не правда ли?
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.