سلام عزیزان
این پست نحوه ذخیره تصویر و بازیابی اون بدون دیتاگرید ویو رو براتون آموزش میدم
ببنید این برنامه میتونه بانک اطلاعاتی تصاویر باشه
البته در صورتیکه تصاویر داراری امنیت و محرمانه بوده 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();
}
}
}
