PDA

View Full Version : سوال: ارسال عکس از فرمی به فرم دیگر



m.bibjan
پنج شنبه 24 فروردین 1391, 15:46 عصر
سلام
من توی دیتابیس برنامم ادرس عکس رو ذخیره میکنم حالا توی فرم جستجو ادرس عکس هم بواسطه نام جستجو شده، توی تکس باکس ها ریخته میشه .بعد میخوام توی یه فرم دیگه بجای ادرس عکس ، خود عکس لود بشه.یعنی لود عکس در فرمی1 ، بواسطه ادرس همان عکس در فرم2.

Sirwan Afifi
پنج شنبه 24 فروردین 1391, 17:03 عصر
من دقیقا منظور شما رو متوجه نشدم ولی خوب برای اینکه شما عکس رو توی فرم دیگه نشون بدید بعد از اینکه کاربر روی نتیجه جستجو در گریدویو دابل کلیک کرد می تونید ID اون سطر رو به صورت پارامتر به فرم دوم پاس بدی و در رویداد Form_Load اطلاعات ID مورد نظرتون رو Fetch کنید و با گذاشتن یه PictuerBox به جای آدرس عکس خود عکس رو نشون بدید :

pictureBox1.Image = Image.FromFile(path);

m.bibjan
پنج شنبه 24 فروردین 1391, 19:54 عصر
سلام
ممنون ولی من در برنامم از دیتاگرید استفاده نکردم که از راه شما استفاده بکنم
ببینید من توی برنامم نتیجه جستجو رو مستقیمابه تکس باکس میریزم
حالا عکس هم طبیعتا در picturebox ریخته میشه
حالا میخوام این عکس که از دیتا بیسم ریخته شده توی picturebox مورد نظر ، توی فرم دیگه هم نمایش داده بشه.

Sirwan Afifi
پنج شنبه 24 فروردین 1391, 20:20 عصر
حالا میخوام این عکس که از دیتا بیسم ریخته شده توی picturebox مورد نظر ، توی فرم دیگه هم نمایش داده بشه.
من دقیقا متوجه نشدم شما می خوای چیکار کنی،
اگر میخوای عکس رو در فرم دیگه هم نشون بدی می تونی همونطور که گفتم عکس رو به فرم دوم پاس بدی یا با پارامتر یا توسط تعریف Property برای فرم دوم
به طور مثال در فرم اول ما یه PictuerBox داریم که حاوی عکس و می خوایم با کلیک بر روی یه Button اون رو در فرم دیگه هم داشته باشیم اول باید یک Property در فرم دوم به این شکل داشته باشیم :

public Image img { get; set; }

و در فرم اول نیز به این صورت عکس رو به فرم دوم ارسال کنیم :

pictureBox1.Image = Image.FromFile(@"C:\pic1.jpg");
Form2 f = new Form2();
f.img = pictureBox1.Image;
f.ShowDialog();

حالا اون آدرس میتونه از دیتابیس خونده بشه مثلا به این صورت :

pictureBox1.Image = Image.FromFile(Application.StartupPath+dt.Rows[0]["image"]);

و در رویداد Form_Load فرم دوم نیز این کد را برای نمایش تصویر می نویسیم :

pic_Url.Image = this.img;

m.bibjan
جمعه 25 فروردین 1391, 15:19 عصر
حالا اون آدرس میتونه از دیتابیس خونده بشه مثلا به این صورت :

pictureBox1.Image = Image.FromFile(Application.StartupPath+dt.Rows[0]["image"]);


این قسمت رو خوب متوجه نشدم.
سوالم اینه که در فرم اول من عکس رو از دیتابیس اوردم بعد در فرم دوم میخوام نمایش داده بشه.
پس طبیعتا فرم دوم ارتباطی به دیتابیس نداره که بخوام ادرس دهی دیتابیسی بهش بکنم.فرم دوم با فرم اول سروکار داره.



pictureBox1.Image = Image.FromFile(@"C:\pic1.jpg");


این قسمت کد هم یه سوالی در موردش داشتم اینه که مگه نباید توی کد امکانی رو ایجاد کنیم که این ادرس ((@"C:\pic1.jpg")) با ادرس محل ذخیره عکس یکی باشه.که توی لود کردن picturebox اون عکس مورد نظر در فرم اول رو بیاره.

Sirwan Afifi
جمعه 25 فروردین 1391, 15:27 عصر
این قسمت رو خوب متوجه نشدم.
سوالم اینه که در فرم اول من عکس رو از دیتابیس اوردم بعد در فرم دوم میخوام نمایش داده بشه.
پس طبیعتا فرم دوم ارتباطی به دیتابیس نداره که بخوام ادرس دهی دیتابیسی بهش بکنم.فرم دوم با فرم اول سروکار داره.


یه نمای گرافیکی از کاری که می خوای انجام بدی یا همون فرم هایی که میگی بذار ببینم دقیقا منظورتون چیه.


این قسمت کد هم یه سوالی در موردش داشتم اینه که مگه نباید توی کد امکانی رو ایجاد کنیم که این ادرس ((@"C:\pic1.jpg")) با ادرس محل ذخیره عکس یکی باشه.که توی لود کردن picturebox اون عکس مورد نظر در فرم اول رو بیاره.

خوب باید آدرسی وجود داشته باشه تا عکس در PictuerBox لود بشه،من پیشنهاد می کنم در داخل پوشه ی Bin یه Folder به اسم Images بذاری و عکس هات رو اونجا ذخیره کنی،برای نمایش تصویر هم همونطور که گفتم از آدرس دهی StartupPath استفاده کنی یعنی فقط اسم عکس رو توی دیتابیس ذخیره کن.

m.bibjan
جمعه 25 فروردین 1391, 17:07 عصر
ممنون
اوضاع اینطوریه.

Mahmoud.Afrad
جمعه 25 فروردین 1391, 19:27 عصر
سلام
اگه عکسو در دیتابییس ذخیره کردید بعد از بازیابی عکس که به صورت آرایه ای از بایت ها در اومده میتونید از فرم دوم اون رو به این صورت در پیکچرباکس نمایش بدید:



System.IO.MemoryStream ms = new MemoryStream(filebyte);
pictureBox1.Image = Image.FromStream(ms);

filebyte آرایه بایت ها هستش.


اگر هم که آدرس عکس یا نامش رو در دیتابیس ذخیره کردید که توضیح دادند دوستان.

Sirwan Afifi
جمعه 25 فروردین 1391, 23:13 عصر
خوب دقیقا به همون صورت که توضیح دادم با استفاده از Property می تونید اطلاعات رو در فرم دیگه نمایش بدید.

m.bibjan
شنبه 26 فروردین 1391, 02:07 صبح
سلام ممنون فقط من یادم رفت بپرسم که واسه ذخیره کردن عکس باید مسیری باشه که بعدا خواستیم از اون مسیر واسه نمایش عکس توی فرم دوم استفاده کنیم عکس اونجا باشه.توی دستور insert چه طوری مسیر دهی کنم ؟

Mahmoud.Afrad
شنبه 26 فروردین 1391, 02:47 صبح
اگر عکس داخل دیتابیس هست برای نمایش نیازی نیست عکس رو روی هارد ذخیره کنید و با استریم میتونید عکس رو به پیکچرباکس بفرستید.



برای ذخیره عکس هم اگر عکس رو داخل دیتابیس میریزید که هیچ ولی اگر نام یا آدرسش رو ذخیره میکنید میتونید دو کار انجام بدید
یکی اینکه فقط آدرس عکس رو به صورت کامل ذخیره کنید و به عکس کاری نداشته باشید
دوم اینکه میتونید با کد یک فولدر در مسیر برنامه ایجاد کنید و یه کپی از عکس رو اونجا ذخیره کنید و فقط نام به همراه پسوند عکس رو ذخیره کنید و برای نمایش عکس در این حالت باید به صورت نسبی آدرسدهی کنید به این صورت :(فولدر images رو ایجاد کردیم، imagename حاوی نام عکس هست که از دیتابیس بدست اومده)


pictureBox1.Image = Image.FromFile(Application.StartupPath + "\\images\\" + imagename);


بعد از بدست اوردن نام عکس کافیه این نام رو به فرم دوم پاس بدید و به جای imagename بذارید.

m.bibjan
شنبه 26 فروردین 1391, 03:26 صبح
ممنون

imagename حاوی نام عکس هست که از دیتابیس بدست اومده
بعد از بدست اوردن نام عکس کافیه این نام رو به فرم دوم پاس بدید و به جای imagename بذارید.


این دو تا قسمت رو من متوجه نشدم. بیشتر توضیح میدین؟

Mahmoud.Afrad
شنبه 26 فروردین 1391, 06:42 صبح
imagename نام یه متغیر هست که تعریف باید بشه و نام عکس رو باید داخلش بذارید(هر نامی که توسط شما انتخاب بشه)
موقع ایجاد فرم دوم از داخل فرم اول مقداردهی میکنید و کد پست11 رو مثلا در لودفرم فرم2 قرار میدید.

m.bibjan
شنبه 26 فروردین 1391, 09:28 صبح
سلام ببخشید تعداد سوالاتم زیاد شد ولی نام عکسم رو باید داخلش بذارم یعنی چی؟ مگه نباید خودش تغییر کنه بواسطه انتخاب شدن عکس؟
و اینکه مگه نباید یه کپی از عکس بگیره و داخل فولدری در پوشه bin قرار بده و بعد ما بیایم بازخونیش کنیم.مثلا این کار؟

if (Directory.Exists(@"c:\CopyAks")==false)
{
DirectoryInfo di= Directory.CreateDirectory(@"c:\CopyAks");
}

و موقع انتخاب عکس بیاد کپی بگیره از عکس و در داخل مسیر فولدر بالا قرار بده.

if (dr==DialogResult.OK)
{
string PicName = System.IO.Path.GetFileName(ofd.FileName);
System.IO.File.Copy(ofd.FileName, "c:\\CopyAks\\" + PicName, true);
MasirAksCopyShode = "c:\\CopyAks\\" + PicName;
pictureBox1.Image = System.Drawing.Image.FromFile(MasirAksCopyShode);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

من کار های بالا رو انجام دادم ولی این خطا رو میده.
کد بازخونی عکس در لود فرم دوم چطوری میشه؟

Sirwan Afifi
شنبه 26 فروردین 1391, 11:14 صبح
شما کافیه فقط اسم عکس رو توی DB ذخیره کنید به این صورت :

FileInfo fa = new FileInfo(dlgOpen.FileName);
fa.CopyTo(Application.StartupPath+"\\"+"cover\\" +dlgOpen.FileName);

برای نمایش تصویر هم :

pictureBox1.Image = Image.FromFile(Application.StartupPath+"\\"+ this.img);

m.bibjan
دوشنبه 04 اردیبهشت 1391, 13:00 عصر
سلام ببخشید من هر کاری کردم نتونستم درستش کنم و عکس رو از فرمی به فرم دیگه ایی ارسال کنم.
نمونه برنامه ای کسی داره بهم بده؟خیلی گیرم انداخته.
ممنون

Sirwan Afifi
دوشنبه 04 اردیبهشت 1391, 13:06 عصر
سلام ببخشید من هر کاری کردم نتونستم درستش کنم و عکس رو از فرمی به فرم دیگه ایی ارسال کنم.
نمونه برنامه ای کسی داره بهم بده؟خیلی گیرم انداخته.
ممنون

دقیقا مشکلتون از کجاست؟

m.bibjan
دوشنبه 04 اردیبهشت 1391, 13:43 عصر
این کدمه توی اوردن عکس توی فرم ثبت نام
DialogResult dr = new DialogResult();
OpenFileDialog ofd = new OpenFileDialog();
FileInfo fa = new FileInfo(ofd.FileName);
fa.CopyTo(Application.StartupPath + "\\" + "cover\\" + ofd.FileName);
ofd.Filter = "jpgfile (*.jpg)|*.jpg";
if (ofd.ShowDialog() == DialogResult.OK)
{
txtimage.Text = ofd.FileName;
picboxadd.LoadAsync(ofd.FileName);
}


این کدمه واسه ذخیره اطلاعات
SqlConnection conn = new SqlConnection();
conn.ConnectionString = @" server = (local) ; database=tester; integrated security = true";

SqlCommand c1 = new SqlCommand();
c1.Connection = conn;
conn.Open();
c1.CommandText = "insert into test1(name,family,picture)values(@name,@family,@pi cture)";
c1.Parameters.AddWithValue("@name", txtname.Text);
c1.Parameters.AddWithValue("@family", txtfamily.Text);
c1.Parameters.AddWithValue("@picture", getByte(txtimage.Text));
c1.ExecuteNonQuery();
conn.Close();

این هم کدمه توی فرم نمایش اطلاعات
Classshow.NAME = txtname.Text;
Classshow.FAMILY = txtfamily.Text;
picboxinfo.Image = Image.FromFile(Application.StartupPath + "\\images\\" + fileimages);
frmshowinfo showinfo = new frmshowinfo();
Thread frmshowinfo = new Thread(delegate() { Runfrmshowinfo(new frmshowinfo()); });
frmshowinfo.Start();

مشکلش کجاست؟
ممنون از لطفتون ببخشید

Mahmoud.Afrad
دوشنبه 04 اردیبهشت 1391, 14:01 عصر
من حالا متوجه شدم شما چی میخوای.
با توجه به اینکه آدرس عکس رو در فرم اول بدست آوردید پس کافیه این آدرس عکس رو به صورت رشته ای ارسال کنید به فرم دوم در لود فرم دوم عکس رو نمایش بدید. در این صورت نیازی به انتقال خود عکس نیست. برای انتقال هم از یه متغیر سراسری در فرم دوم استفاده کنید یا از پروپرتی. جستجو در این زمینه با عهده خودتون.

m.bibjan
دوشنبه 04 اردیبهشت 1391, 14:19 عصر
چه کدی و کجا باید بنویسم؟

Mahmoud.Afrad
دوشنبه 04 اردیبهشت 1391, 15:12 عصر
در فرم دوم:


public string path { get; set; }
private void Form2_Load(object sender, EventArgs e)
{
pictureBox1.Image = Image.FromFile(path);
}


در فرم اول :


private void button2_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.path = Application.StartupPath + "\\images\\" + fileimages;
f2.Show();
}

البته با توجه به کدی که نوشتید تغییر بدید.

m.bibjan
دوشنبه 04 اردیبهشت 1391, 18:20 عصر
سلام من این کار رو کردم ولی نشد.حجم برنامه خودم هم زیاده نشد بذارم.
اگه لطف کنید یه نمونه برنامه کوچولو بذارین ممنون میشم.
خیلی گیج شدم توی این قضییه.

m.bibjan
دوشنبه 04 اردیبهشت 1391, 18:34 عصر
86186
دقیقا مشکلتون از کجاست؟

مشکل دقیقا اینجاست که عکس رو پیداش نمیکنه که بخواد انتقالش بده به فرم بعدی

Mahmoud.Afrad
دوشنبه 04 اردیبهشت 1391, 19:03 عصر
1-باید دقت کنید که در دیتابیس ، نام فایل رو همراه پسوند ذخیره کرده باشید.
2-مطمئن بشید چنین فایلی در پوشه ایمیج هست یانه.

m.bibjan
دوشنبه 04 اردیبهشت 1391, 19:41 عصر
1-باید دقت کنید که در دیتابیس ، نام فایل رو همراه پسوند ذخیره کرده باشید.

نام به همراه پسوند چطوریه کدش؟
همون ذخیره نام عکس دیگه درسته؟

Mahmoud.Afrad
دوشنبه 04 اردیبهشت 1391, 21:26 عصر
اگر از
OpenFileDialog op = new OpenFileDialog();
if (op.ShowDialog() == System.Windows.Forms.DialogResult.OK)
textBox3.Text = op.FileName;
استفاده کنید آدرس کامل فایل بدست میاد.

اگر بخواید نام به همراه پسوند رو بدست بیارید باید از
OpenFileDialog op = new OpenFileDialog();
if (op.ShowDialog() == System.Windows.Forms.DialogResult.OK)
textBox3.Text = op.SafeFileName;
استفاده کنید.
روش دوم حجم کمتری از دیتابیس رو اشغال میکنه.