PDA

View Full Version : سوال: نحوه ی ذخیره از picturebox به database و بازیابی از database به picturebox



mohammad kafiyan
پنج شنبه 07 مرداد 1389, 12:21 عصر
سلام به دوستان
مشکلی داشتم و این است که در فرم یک picturebox دارم و با استفادده openfilediloge عکس در آن load می کنم
کد مربوط به نحوه ی ذخیره از picturebox به database و بازیابی از database به picturebox را میخواهم
با تشکر از دوستان
:لبخندساده:

MSN_Issue
پنج شنبه 07 مرداد 1389, 12:52 عصر
یه سری به این پست (http://barnamenevis.org/forum/showpost.php?p=1009813&postcount=424) بزن !

mohammad kafiyan
پنج شنبه 07 مرداد 1389, 13:01 عصر
سلام دوست عزیز MSN_Issue می تونی یک کمی راجب این کد توضیح بدی من اصلا کار نکردم و من می خواهم با استفاده از storedproceduer اطلاعات و تصویر مورد نظر را ذخیره و بازیابی کنم

MSN_Issue
پنج شنبه 07 مرداد 1389, 13:48 عصر
متاسفانه من هم خیلی با storedproceduer آشنایی ندارم ، اما
این کد ، کد دوتا تابع هست ، یکی برای تبدیل عکس به رشته و یکی برای برگردوندن رشته به عکس .
شما میتوند عکستون رو به صورت رشته توی دیتابیس ذخیره کنید ، فقط به یاد داشته باشید اگه از اکسس استفاده میکند باید نوع فیلد رو Memo و اگه از SQL استفاده میکنید ، nText بذارید .

حجتی نیا
پنج شنبه 07 مرداد 1389, 16:03 عصر
من طبق نظرات عکس رو به رشته تبدیل میکنم که درست انجام میشه، نوع فیلد رو در دیتابیس ntext قرار میدم اما چیزی درونش ذخیره نمیشه؟

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
System.Drawing.Image img = System.Drawing.Image.FromFile(openFileDialog1.File Name);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
string b64 = Convert.ToBase64String(ms.ToArray());
// Housecleaning: Get rid of the local instances
img.Dispose();
ms.Close();

SqlCommand com = new SqlCommand("insert into table1(a,b)values (@a,@b)", sc);
com.Parameters.AddWithValue("@a", textBox1.Text);
com.Parameters.AddWithValue("@b", b64);
sc.Open();
com.ExecuteNonQuery();
sc.Close();

mohammad kafiyan
پنج شنبه 07 مرداد 1389, 19:46 عصر
سلام به دوستان اگر کسی در این زمینه کار کرده کمک کنه چون بدجوری نیاز دارم
:ناراحت::متفکر:

MSN_Issue
پنج شنبه 07 مرداد 1389, 21:12 عصر
ولی من هم از تابع زیر برای تبدیل عکس به رشته استفاده کردم :


private string imgTOstring(string path)//تبدیل عکس به رشته
{
Image img = Image.FromFile(@"" + path);
Bitmap b = new Bitmap(img, new Size(200, 275));
img = b;
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
string b64 = Convert.ToBase64String(ms.ToArray());
ms.Close();
return b64;
}


و بعد اون رو به دیتابیسم اینسرت کردم (البته من با اکسس کار میکنم ، شاید توی sql باید کار دیگه ای انجام بدین)
اطلاعات (حدود 26000 کاراکتر) توی اون فیلد ذخیره میشه !

mohammad kafiyan
شنبه 09 مرداد 1389, 13:31 عصر
سلام به دوستان
مشکلی داشتم و این است که در فرم یک picturebox دارم و با استفادده openfilediloge عکس در آن load می کنم
کد مربوط به نحوه ی ذخیره از picturebox به database و بازیابی از database به picturebox را میخواهم
با تشکر از دوستان


سلام دوست عزیز MSN_Issue می تونی یک کمی راجب این کد توضیح بدی من اصلا کار نکردم و من می خواهم با استفاده از storedproceduer اطلاعات و تصویر مورد نظر را ذخیره و بازیابی کنم

سلام به دوستان،آنقدر بر روی اون کار کردم تا مشکلم حل شد هر کسی نیاز داره که براش کدش بگذارم درخواست بده

حجتی نیا
شنبه 09 مرداد 1389, 14:47 عصر
نیاز به اعلام درخواست نیست،شما کد رو بزار هرکی لازم داره استفاده میکنه
پست 5 دیده شود..

mohammad kafiyan
شنبه 09 مرداد 1389, 17:58 عصر
نیاز به اعلام درخواست نیست،شما کد رو بزار هرکی لازم داره استفاده میکنه
بفرما خوب آقای حجتی نیا ، شما استاد مایی و من قصد جسارت نداشتم و منظورم این بود اگر کسی در این زمینه کار نکرده تایپیک بزنه تا code ها را برایش بگذارم

در database فیلد تصویر را از نوع image تعیین کنید

سپس یک storedproceduer جهت insert تعریف کرده:



public void insert(byte[] picture)
{
SqlCommand cmd = new SqlCommand();
try
{
connect();
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
;"cmd.CommandText = @"insert
cmd.Parameters.Add("@picture", SqlDbType.Binary).Value = picture;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
cmd.Dispose();}
}


حال در همان فرم مربوطه در button مربوطه از کد زیر استفاده می شود :


MemoryStream image = new MemoryStream();
pictureBox2.Image.Save(image, pictureBox2.Image.RawFormat);
byte[] picuter = image.GetBuffer();
image.Close();
(insert(pictuer

با تشکر از دوستان که در این زمینه ها به همدیگر کمک می کنند

hojjatshariffam
شنبه 09 مرداد 1389, 21:27 عصر
سلام خدمت همه دوستان
من از کد زیر برای این کار استفاده می کنم و خیلی خوب هم جواب میده ولی یکم طمان بر هست که برای این کار از یک نخ استفاده می کنم و به این طریق فرم فریز نمیشه



private void EnCodeSign()
{
int picIndex = 0;
Bitmap pic;
pic = new Bitmap(UserSignature.Image);
long PicSize = 0;
PicSize = pic.Height * pic.Width * 3 + 4;
Sign_Byte = new Byte[PicSize];

int Temp = pic.Height / 255;
Sign_Byte[picIndex++] = Convert.ToByte(Temp);
Temp = pic.Height % 255;
Sign_Byte[picIndex++] = Convert.ToByte(Temp);
Temp = pic.Width / 255;
Sign_Byte[picIndex++] = Convert.ToByte(Temp);
Temp = pic.Width % 255;
Sign_Byte[picIndex++] = Convert.ToByte(Temp);

Color tmcolor;
for (int y = 0; y < pic.Height; y++)
{
for (int x = 0; x < pic.Width; x++)
{
tmcolor = pic.GetPixel(x, y);
Sign_Byte[picIndex++] = tmcolor.R;
Sign_Byte[picIndex++] = tmcolor.G;
Sign_Byte[picIndex++] = tmcolor.B;
}
}
SystemUserManagment.UpdateSign_With_Key(User, Sign_Byte);
ChangeSign = false;
if (!ChangePic && !ChangeSign)
FMessageBox.Show("مشخصات مورد نظر با موفقیت تغییر یافت");
}


و برای بازگرداندنش هم این کد رو می نویسم



private void DeCodeSign()
{
int picIndex = 0;
Sign_Byte = SystemUserManagment.FetchSign_With_Key(User);
if (Sign_Byte != null)
{
int PicSizeY = Convert.ToInt32(Sign_Byte[picIndex++]) * 255 + Convert.ToInt32(Sign_Byte[picIndex++]);
int PicSizeX = Convert.ToInt32(Sign_Byte[picIndex++]) * 255 + Convert.ToInt32(Sign_Byte[picIndex++]);
Bitmap pic = new Bitmap(PicSizeX, PicSizeY);
Color tmcolor;
for (int y = 0; y < PicSizeY; y++)
{
for (int x = 0; x < PicSizeX; x++)
{
tmcolor = Color.FromArgb(Sign_Byte[picIndex++], Sign_Byte[picIndex++], Sign_Byte[picIndex++]);
pic.SetPixel(x, y, tmcolor);
}
}

UserSignature.Image = pic;
}
else
UserSignature.Image = null;
}


من کد شما بنظرم خیلی بهتر اومد ولی تو استفاده یه خطا داد
ببینید میشه حلش کرد؟



A generic error occurred in GDI+.


این خطا رو جایی میده که قراره به ممری استریم ذخیره کنه

حجتی نیا
یک شنبه 10 مرداد 1389, 11:18 صبح
System.IO.MemoryStream ms = new System.IO.MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
string b64 =Convert.ToBase64String( ms.ToArray());
// Housecleaning: Get rid of the local instances
img.Dispose();
ms.Close();
//int a=b64.Length;
SqlCommand com = new SqlCommand("insert into table1(a,b)values (@a,@b)", sc);
com.Parameters.AddWithValue("@a", textBox1.Text);
com.Parameters.AddWithValue("@b", SqlDbType.NText).Value = b64;
sc.Open();
com.ExecuteNonQuery();
sc.Close();
تو پست 5 کدی رو گذاشتم ولی چیزی ذخیره نمیشه،حالا اینجوری نوشتم ولی بازم ذخیره نمیشه.. واسه عکسهایی که حجمشون خیلی خیلی کمه ذخیره میشه ولی برای عکسهای بزرگ ...

نمیخوام بصورت image در دیتابیس ذخیره کنم..

mohammad kafiyan
یک شنبه 10 مرداد 1389, 11:40 صبح
سلام به دوستان برنامه را ضمیمه کردم
فقط در storedproceduer مربوط به select pic_show ساده به database زده شده حال برای نمایش تصویر برای اینکه مشکلی پیش نیاید بر اساس یک شرط قرار دهید
موفق باشید

حجتی نیا
یک شنبه 10 مرداد 1389, 12:00 عصر
سلام به دوستان برنامه را ضمیمه کردم
فقط در storedproceduer مربوط به select pic_show ساده به database زده شده حال برای نمایش تصویر برای اینکه مشکلی پیش نیاید بر اساس یک شرط قرار دهید
موفق باشید
دوست گرامی،شما فیلد عکس رو در دیتابیس از نوع image قرار دادین و این روشی که کاملا مشخصه درضمن این روش باعث افزایش ییبش ازحد حجم دیتابیس میشه...
پست 5و12