سلام دوستان
زماني هست كه مي خواهيم در يك بانك عكس ذخيره كنم اما عكس هايي كه كاربر مي بيني از نظر حجم و اندازه بسيار بزرگ براي همين لازمه فقط يك نمونه كوچك شده عكس براي مراجعات بعدي تو بانك ذخيره بشه
من مي خوام عكسي كه مسيرش به برنامه داده مي شه ابتدا Resize (كوچك) و بعد ذخيره بشه در عين حال به عكس اصلي كاري نداريم و تغييري نبايد ايجاد بشه و در اين مثال بانك Access هست و فرمت فيلد عكس داخل بانك هم از نوع OLE Object هست. براي SQL Server هم از نوع( VARBINERY(MAX مي شه استفاده كرد.
من از كد زير استفاده كردم و اول عكس با سايز جديد بر روي مموري يا رَم ايجاد مي كنم
StringBuilder path;
private void selectButton_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
path = new StringBuilder(openFileDialog1.FileName);
Bitmap btm = new Bitmap(path.ToString());
int x = btm.Width;
int y = btm.Height;
SetSize(ref x, ref y);
btm = new Bitmap(btm, x, y);
// btm.Save(openFileDialog1.FileName + ".gif");
imageBox1.Image = btm;
}
}
private void SetSize(ref int x, ref int y)
{
if (x > y)
{
y = (y * 200) / x;
x = 200;
}
else if (x < y)
{
x = (x * 200) / y;
y = 200;
}
else if (x == y)
{
x = 200;
y = 200;
}
}
من در اينجا خواستم با تابع SetSize به اندازه دلخواه خودم كه حداكثر عرض و طول 200px بوده در بيارم
بعد اون تو بانك با كد زير ذخيره مي كنيم(در اينجا من از اكسس 2007 استفاده كردم واسه همين پس بانك accdb. هستش)
private void addButton_Click(object sender, EventArgs e)
{
try
{
string strConnction="Provider=Microsoft.ACE.OLEDB.12.0;Da ta Source="+Application.StartupPath+"\\PicDB.accdb";
OleDbConnection oleDbCommand1 = new OleDbConnection();
OleDbCommand oleDbCommand1 = new OleDbCommand();
oleDbCommand1.Connection = oleDbConnection1;
MemoryStream ms = new MemoryStream();
imageBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.GetBuffer();
oleDbCommand1.Parameters.Clear();
oleDbCommand1.Parameters.Add("@Id",OleDbType.BSTR) .Value = textBox1.Text;
oleDbCommand1.Parameters.Add("@Pic", OleDbType.Binary).Value = bytes;
oleDbCommand1.CommandText = "insert into Pic (id, pic) values(@Id, @pic)";
oleDbConnection1.Open();
oleDbCommand1.ExecuteNonQuery();
oleDbConnection1.Close();
MessageBox.Show("Saved successful");
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
}
مايکروسافت قويا هشدار داده است که ديگر از نوع داده IMAGE استفاده نکنيد و به جاي آن از نوع دادة (VARBINERY(MAX استفاده کنيد؛ بايد بدانيد که نوع دادة IMAGE فقط براي سازگاري با SQL Server 2000 هنوز در SQL Server 2005 وجود دارد و در نگارش بعدي SQL Server ، ديگر اين نوع داده پشتيباني نخواهد شد.
اميدوارم بدرد ديگران هم بخوره...