PDA

View Full Version : تغيير سايز عكس و ذخيره در بانك اكسس چطوره ؟



احمد سامعی
شنبه 17 اسفند 1387, 12:47 عصر
سلام دوستان

زماني هست كه مي خواهيم در يك بانك عكس ذخيره كنم اما عكس هايي كه كاربر مي بيني از نظر حجم و اندازه بسيار بزرگ براي همين لازمه فقط يك نمونه كوچك شده عكس براي مراجعات بعدي تو بانك ذخيره بشه
من مي خوام عكسي كه مسيرش به برنامه داده مي شه ابتدا 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;Data 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 ، ديگر اين نوع داده پشتيباني نخواهد شد.


اميدوارم بدرد ديگران هم بخوره...:لبخندساده:

danial82
سه شنبه 22 اردیبهشت 1388, 15:10 عصر
من چنین اروری میگیرم البته تو sql


string or binary type would be truncate

mahdi_7610
سه شنبه 22 اردیبهشت 1388, 23:33 عصر
اول از همه از زحمات اقای سامعی تشکر میکنم .

کدی که برای ذخیره تصویر نوشته بودن را من به sql برگردوندم اما متاسفانه کار نکرد . به خاطر همین من کدشون را مقداری تغییر دادم .

دوستان میتونند برای ذخیره عکس توی sql sarver از کد زیر استفاده کنند .


private void btnAdd_Click(object sender, EventArgs e)
{
try
{
SqlConnection con = new SqlConnection("Data Source=MAHDI\\SQLEXPRESS;Initial Catalog=Picture;Integrated Security=True");
string strSQL = "INSERT INTO TablePic(ID, Pic) VALUES(@ID ,@Pic)";
con.Open();
SqlCommand cmd = new SqlCommand(strSQL, con);
MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.GetBuffer();
cmd.Parameters.Add("@ID", SqlDbType.NVarChar, 50).Value = textBox1.Text;
cmd.Parameters.Add("@Pic", SqlDbType.VarBinary).Value = bytes;
cmd.ExecuteNonQuery();
con.Close();
MessageBox.Show("Saved successful");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}

موفق باشید .

احمد سامعی
سه شنبه 22 اردیبهشت 1388, 23:56 عصر
با تشكر از جناب آقاي مهدي گل
و با عرض پوزش از آقا دانيال عزيز
شرمنده دوستان من كد و نمونه برنامه كار با SQL Server رو هم آماده كرده بودم اما اين روزها يكم درگير بنايي هستم واسه همين نتونستم بفرستم
كد جناب مهدي خان كاملاً درست و بايد از همين كد واسه SQL Server استفاده بشه و فكر كنم احتياج به آپلود اون برنامه نباشه تا بار اضافي براي سرور سايت باشه(مي تونيد نمونه برنامه اين كار از لينك پست پايين بگيريد)

اميدوارم بدرد همه بخوره

ذخيره، بازيابي و به روزرساني عكس در پايگاه داده (http://barnamenevis.org/forum/showthread.php?t=158526)