سلام عزیزان
این پست نحوه ذخیره تصویر و بازیابی اون بدون دیتاگرید ویو رو براتون آموزش میدم
ببنید این برنامه میتونه بانک اطلاعاتی تصاویر باشه
البته در صورتیکه تصاویر داراری امنیت و محرمانه بوده 2 راه اینجا میشه مطرح کرد اول اینکه دیتابیس مورد نظر رو رمزگذاری کنیم که و این پروژه همین کار رو انجام دادم
و دومین کار اینه که میتونیم داده هایی که تودیتابیس ذخیره میشن رو به حالت رمزنگاری تبدیل کرده و سپس ذخیره کرد
اما همین روش اول نیز امنیت تصاویر را تا حدودی تامین میکنه
برای شروع با اکسس یه دیتابیس بسازید و اسمش رو مثلا Dbpic بزاریم و یه جدول با نام tblpic تعیین کنید و 3 فیلد بهش اضافه کنید فیلد اول بنام آی دی و فیلد دوم فیلد ذخیره تصویر با نوع object و فیلد سوم که از این فیلد برای شناسایی تصاویر استفاده میکنیم فیلد اسم تصاویر هست..
خب وقتی دیتابیس ساخته شد داخل فرم تو سی شارپ یه picbox بزارید و برای جلوگیری از حرکت اون رو قفل کنید و حالت عکس رو روی استرچ بزارید
خب 4 تا باتن میزاریم یکی برای اتخاب تصویر -دومی برای ذخیره تصویر توی دیتابیس و 2تا برای نمایش عکس یکی با نام و دیگری با شماره ردیف
کد زیر برای انتخاب تصویر هست
OpenFileDialog op = new OpenFileDialog(); if (op.ShowDialog() == DialogResult.OK) { textBox1.Text = op.SafeFileName; pictureBox1.ImageLocation = op.FileName; }
برای ذخیره تصویر هم میبایست یه متد تبیل تصویر به بایت مینویسیم
public static byte[] ImageToByte(Image img) { ImageConverter converter = new ImageConverter(); return (byte[])converter.ConvertTo(img, typeof(byte[])); }
و توی باتن ذخیره به این شکل ازش استفاده میکنیم
private void Btnsavepic_Click(object sender, EventArgs e) { filename = Path.GetFileName(textBox1.Text); OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\dbpic.accdb"); string query = "Insert Into tblpic (savepic,picname) Values (@save,@name)"; OleDbCommand com = new OleDbCommand(query, con); com.Parameters.AddWithValue("@save", ImageToByte(pictureBox1.Image)); com.Parameters.AddWithValue("@name",filename); con.Open(); com.ExecuteNonQuery(); con.Close(); MessageBox.Show("Save Success!"); }
و برای نمایش تصویر از این کد استفاده میکنیم تفاوت نمایش تصویر بوسیله آی دی و یا نام تصویر در انتخاب نام فیلد جدول هست
OleDbConnection co nn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\dbpic.accdb"); OleDbCommand SQLCommand = new OleDbCommand(); conn.Open(); string getpwd = textBox1.Text.ToString(); string query2 = "select * from tblpic WHERE picname= '" + getpwd + "'"; Console.Write(query2); OleDbCommand s = new OleDbCommand(query2, conn); OleDbDataReader bReader = s.ExecuteReader(); if (textBox1.Text == "") { MessageBox.Show("Please Enter the Image name to retrive!!"); }
خیلی پیچیده نیست و دیدم برای چنین برنامه ای 4 برابر این کدنویسی شده که برای بهینه سازی و تجاری کردن برنامه مانند استفاده از بک گراند ورکر و استفاده از async لازم هست
در انتها سورس رو برای استفاده میذارم دانلــــــــــــــود
همه کد ها
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Data.OleDb; using System.Text; using System.Windows.Forms; using System.IO; namespace pic_save { public partial class Form1 : Form { public Form1() { InitializeComponent(); } string filename = null; OleDbConnection con; OleDbCommand cmd; private void Btnsavepic_Click(object sender, EventArgs e) { filename = Path.GetFileName(textBox1.Text); OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\dbpic.accdb;Jet OLEDB:DATABASE password=test++"); string query = "Insert Into tblpic (savepic,picname) Values (@save,@name)"; OleDbCommand com = new OleDbCommand(query, con); com.Parameters.AddWithValue("@save", ImageToByte(pictureBox1.Image)); com.Parameters.AddWithValue("@name",filename); con.Open(); com.ExecuteNonQuery(); con.Close(); MessageBox.Show("Save Success!"); } public static byte[] ImageToByte(Image img) { ImageConverter converter = new ImageConverter(); return (byte[])converter.ConvertTo(img, typeof(byte[])); } private void Btnselect_Click(object sender, EventArgs e) { OpenFileDialog op = new OpenFileDialog(); if (op.ShowDialog() == DialogResult.OK) { textBox1.Text = op.SafeFileName; pictureBox1.ImageLocation = op.FileName; } } private void Btngetpic_Click(object sender, EventArgs e) { OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\dbpic.accdb;Jet OLEDB:DATABASE password=test++"); OleDbCommand SQLCommand = new OleDbCommand(); conn.Open(); string getpwd = textBox1.Text.ToString(); string query2 = "select * from tblpic WHERE picname= '" + getpwd + "'"; Console.Write(query2); OleDbCommand s = new OleDbCommand(query2, conn); OleDbDataReader bReader = s.ExecuteReader(); if (textBox1.Text == "") { MessageBox.Show("Please Enter the Image name to retrive!!"); } else if (bReader.Read()) { byte[] b = new byte[0]; b = (Byte[])(bReader["savepic"]); MemoryStream ms = new MemoryStream(b); pictureBox1.Image = Image.FromStream(ms); //pictureBox1.Image = Convert.ToSByte(dr["Url"].ToString()); } else { MessageBox.Show("Please Enter Valid Image name!!!"); } conn.Close(); } private void Button1_Click(object sender, EventArgs e) { con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\dbpic.accdb;Jet OLEDB:DATABASE password=test++"); con.Open(); cmd = new OleDbCommand("Select * From tblpic where ID=" + textBox1.Text, con); OleDbDataAdapter da = new OleDbDataAdapter(cmd); DataSet ds = new DataSet(); da.Fill(ds); if (ds.Tables[0].Rows.Count > 0) { MemoryStream ms = new MemoryStream((byte[])ds.Tables[0].Rows[0]["savepic"]); pictureBox1.Image = new Bitmap(ms); } } private void PictureBox2_Click(object sender, EventArgs e) { this.Close(); } } }