PDA

View Full Version : سوال: کی تا حالا با عکس کار کرده؟



neda_dela
چهارشنبه 11 آذر 1388, 20:48 عصر
بچه ها کسی تا حالا اصلا با عکس کار کرده
من تا حالا سوالم رو به روش های مختلف عنوان کردم ولی کسی جواب نداده
اگه می تونین به این لینک برین
http://barnamenevis.org/forum/showthread.php?t=193021
و یا این یکی
http://barnamenevis.org/forum/showthread.php?t=192592
خواهش می کنم بد جوری گیر کردم کمک کنید بچه ها

mosi_asgari
چهارشنبه 11 آذر 1388, 23:26 عصر
سلام دوست عزیز

من به کد شما یه نگاهی کردم ، به نظر همه چیز درست میاد ، اما من امکانات debug کردم ندارم اما چند جای کد شما شاید مشکلی داشته باشد. لطفا این هایی را که میگم خودت چک کن ببین درست می شه یا نه.

اولین جایی که ممکنه که مشکل داشته باشه در این خط است :


pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);

سر این خط یک BreakPoint بزار ، بعد که برنامت رسید به این خط ، یک F8 بزن تا برنامت یک خط دیگه را اجرا کنه بعد با موس بیا روی متغیر ms بعد روی + کلیک کن تا باز بشه بعد ببین Length یکی از خصوصیات MemoryStream است مقدارش چند است؟ اگر صفر بود یعنی اینکه اصلا pictureBox شما Image خودش را نتوانسته که Save کند اما اگر مقداری بزرگتر از صفر بود مشکل از اینجا نیست.

اگه مشکل از بالا نبود یک کار دیگر را امتحان کن : خط ms.Close() را از برنامت پاک کن و برنامت را یک بار دیگه تست کن ببین مشکل حل می شه یا نه. ms.Close() را بعد از ذخیره کردن در DB بگذار تا خیالت راحت تر شود.
البته باز هم مطمئن شو که arrayImage شما null نیست و همچنین دارای اطلاعات می باشد.

من نمی دونم که sabtterm_Load(sender,e) چه کاری انجام می دهد اما برای اینکه مطمئن شوی که عکست در DB ذخیره شده یا نه خود Table دیتابیس رو باز کن و ببین و از برنامه خودت چک نکن.

نتایجت رو بگو تا بازم کمکت کنم.

یا علی.

neda_dela
پنج شنبه 12 آذر 1388, 11:02 صبح
سلام دوست عزیز

من به کد شما یه نگاهی کردم ، به نظر همه چیز درست میاد ، اما من امکانات debug کردم ندارم اما چند جای کد شما شاید مشکلی داشته باشد. لطفا این هایی را که میگم خودت چک کن ببین درست می شه یا نه.

اولین جایی که ممکنه که مشکل داشته باشه در این خط است :


pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);

سر این خط یک BreakPoint بزار ، بعد که برنامت رسید به این خط ، یک F8 بزن تا برنامت یک خط دیگه را اجرا کنه بعد با موس بیا روی متغیر ms بعد روی + کلیک کن تا باز بشه بعد ببین Length یکی از خصوصیات MemoryStream است مقدارش چند است؟ اگر صفر بود یعنی اینکه اصلا pictureBox شما Image خودش را نتوانسته که Save کند اما اگر مقداری بزرگتر از صفر بود مشکل از اینجا نیست.

اگه مشکل از بالا نبود یک کار دیگر را امتحان کن : خط ms.Close() را از برنامت پاک کن و برنامت را یک بار دیگه تست کن ببین مشکل حل می شه یا نه. ms.Close() را بعد از ذخیره کردن در DB بگذار تا خیالت راحت تر شود.
البته باز هم مطمئن شو که arrayImage شما null نیست و همچنین دارای اطلاعات می باشد.

من نمی دونم که sabtterm_Load(sender,e) چه کاری انجام می دهد اما برای اینکه مطمئن شوی که عکست در DB ذخیره شده یا نه خود Table دیتابیس رو باز کن و ببین و از برنامه خودت چک نکن.

نتایجت رو بگو تا بازم کمکت کنم.

یا علی.
مرسی دوست جون از توجهت. خیلی بده که آدم بیاد ببینه جواب نداشته

بعد که برنامت رسید به این خط ، یک F8 بزن تا برنامت یک خط دیگه را اجرا کنه
فکر کنم منظورت f10 بوده چون f8 که زدم هیچ اتفاقی نیفتاد
مقدار length صفر نبود. مقدار داشت
خط ms.Close() رو هم پاک کردم اما تغییری نکرد بازم خطا داد. راستی خطای برنامه رو دیدی؟

ms.Close() را بعد از ذخیره کردن در DB بگذار تا خیالت راحت تر شود.
البته باز هم مطمئن شو که arrayImage شما null نیست و همچنین دارای اطلاعات می باشد.

منظور این دو خط رو نفهمیدم یعنی چی که توی dbبذارم؟
منظورت از arrayimage همون length هست که گفتی برم ببینم صفره یا نه؟

من نمی دونم که sabtterm_Load(sender,e) چه کاری انجام می دهد
این خط دوباره فرمم رو لود می کنه تا هر رکوردی که جدید ثبت میشه همون لحظه توی گرید نشون داده بشه و نیازی به دوباره اجرا کردن برنامه نباشه

برای اینکه مطمئن شوی که عکست در DB ذخیره شده یا نه خود Table دیتابیس رو باز کن و ببین و از برنامه خودت چک نکن.
این کار رو انجام دادم ولی در هر دو صورت چه عکس ذخیره شده باشه و چه نه ، توی مقدار فیلد pic که همون عکس هست این میشینه : <Binary>
فیلد عکس من از نوع image هست
علی یارت

mosi_asgari
پنج شنبه 12 آذر 1388, 16:44 عصر
سلام

خواهش می کنم. آره منظور من همون F10 بود. :چشمک:

اینکه میگی مقدار Length صفر نبود یعنی اینکه عکس شما با موفقیت در ms شما ذخیره می شود پس مشکل از اینجا نیست.

منظور من از arrayImage همون خطی بود که نوشته بودی :


byte[] arrayImage = ms.GetBuffer();

منظورم این بود که ببینی متغیر arrayImage شما null نباشد یا اگر null نیست اطلاعاتی در این arrayImage باشد. منظورم Length نبود!

خوب ، اگه ms.Close() رو برداشتی و باز هم error میداد پس مشکل از این خط نیست. راستی من error شما رو نمی دونم اگه error رو برام بزاری شاید بهتر بتونم کمکت کنم.

منظورم از این که ms.Close() رو بعد از ذخیره کردن در DB بگذار ( DB همون DataBase است ) اینه که مثلا بعد از خط :


cmd.ExecuteNonQuery();

بگذاری البته مشکل از ms.Close() نیست.

یک چیزه دیگه ! در جدول شما در دیتابیس فیلد pic شما که از جنس Image است آیا مقدار null هم می تونه بگیره؟؟؟؟

اگه جوابت آره باشه یعنی اینکه عکس شما در DB ذخیره میشه :تشویق: چون اگه ذخیره نشه با NULL نشون میده در غیر اینصورت با <Binary> یا <Binary Data> نشون میده که به معنی اینه که این فیلد حاوی مقادیر باینری است.

حدس خود من اینه که الان عکس شما در DB ذخیره شده است چون مقدار <Binary> رو داره و یه جایی داری اشتباه می کنی. ( خیلی خیلی مهمه )

خوب پس شما کاری که می کنی این ها رو یه چک کن. error رو هم پست کن برام.

یا علی.

neda_dela
پنج شنبه 12 آذر 1388, 19:36 عصر
سلام

خواهش می کنم. آره منظور من همون F10 بود. :چشمک:

اینکه میگی مقدار Length صفر نبود یعنی اینکه عکس شما با موفقیت در ms شما ذخیره می شود پس مشکل از اینجا نیست.

منظور من از arrayImage همون خطی بود که نوشته بودی :


byte[] arrayImage = ms.GetBuffer();

منظورم این بود که ببینی متغیر arrayImage شما null نباشد یا اگر null نیست اطلاعاتی در این arrayImage باشد. منظورم Length نبود!

خوب ، اگه ms.Close() رو برداشتی و باز هم error میداد پس مشکل از این خط نیست. راستی من error شما رو نمی دونم اگه error رو برام بزاری شاید بهتر بتونم کمکت کنم.

منظورم از این که ms.Close() رو بعد از ذخیره کردن در DB بگذار ( DB همون DataBase است ) اینه که مثلا بعد از خط :


cmd.ExecuteNonQuery();

بگذاری البته مشکل از ms.Close() نیست.

یک چیزه دیگه ! در جدول شما در دیتابیس فیلد pic شما که از جنس Image است آیا مقدار null هم می تونه بگیره؟؟؟؟

اگه جوابت آره باشه یعنی اینکه عکس شما در DB ذخیره میشه :تشویق: چون اگه ذخیره نشه با NULL نشون میده در غیر اینصورت با <Binary> یا <Binary Data> نشون میده که به معنی اینه که این فیلد حاوی مقادیر باینری است.

حدس خود من اینه که الان عکس شما در DB ذخیره شده است چون مقدار <Binary> رو داره و یه جایی داری اشتباه می کنی. ( خیلی خیلی مهمه )

خوب پس شما کاری که می کنی این ها رو یه چک کن. error رو هم پست کن برام.

یا علی.
سلام


یک چیزه دیگه ! در جدول شما در دیتابیس فیلد pic شما که از جنس Image است آیا مقدار null هم می تونه بگیره؟؟؟؟

آره . اس کیو ال من 2000 هست (خیلی د مده هستم نه:قهقهه:) تیک allow nulls رو گذاشتم
آره الان که عکسی توی گرید نشون نمیده ولی توی بانک مقدار فیلد پیک <binary> هست.
ببین من فایل ها و عکس هامو برای اینکه توی سایت بذارم میرم توی سایت persiandrive.net آپلود می کنم و آدرسشو می ذارم اینجا .
Error رو باید ازش عکس بگیرم و عکسش رو برات بذارم چون خیلی بزرگه یه خط دو خط نیست
حالا البته آپلودش کردم. ولی مثل اینکه دوستان نمی تونن بازش کنن:ناراحت:
من دیدم که توی سایت دوستان عکس ها رو راحت می ذارن و نیازی به دانلود نداره من نمی دونم باید عکس ها رو چه طوری بذارم؟
از ابزار "وارد نمودن عکس" سایت هم استفاده کردم ولی عکس رو نشون نمیده ضربدر می ذاره نمی دونم چی کار کنم :متفکر:
البته بعضی ها هم تونستن دانلود کنن تا حالا
دوباره میذترم انشالله که باز بشه
http://persiandrive.com/898691

mosi_asgari
پنج شنبه 12 آذر 1388, 20:31 عصر
سلام

من error شما رو دیدم. فکر کنم احتمال خیلی زیاد مشکل از نحوه load کردن اطلاعات در DataGridView باشه.

شما می تونید بدون کد نویسی DataGridView خودتونو Bind کنید. کافیست روی GridView کلیک کنید بعد وقتی که اون مثلث کوچیک نمایش داده میشه ، DataSource خودت رو انتخاب کنی و بعد فیلدهایی که می خوای نمایش بده. روش کار خیلی ساده است. من تست کردم دیدم فیلد های Image رو هم خودش نشون میده :متعجب: و مشکلی نداره.

اما تو خودت GridView خودت رو Bind کردی برای همین شاید مشکل از همون sabtterm_Load باشه. کد sabtterm_Load رو قرار بده.

neda_dela
پنج شنبه 12 آذر 1388, 21:51 عصر
سلام

من error شما رو دیدم. فکر کنم احتمال خیلی زیاد مشکل از نحوه load کردن اطلاعات در DataGridView باشه.

شما می تونید بدون کد نویسی DataGridView خودتونو Bind کنید. کافیست روی GridView کلیک کنید بعد وقتی که اون مثلث کوچیک نمایش داده میشه ، DataSource خودت رو انتخاب کنی و بعد فیلدهایی که می خوای نمایش بده. روش کار خیلی ساده است. من تست کردم دیدم فیلد های Image رو هم خودش نشون میده :متعجب: و مشکلی نداره.

اما تو خودت GridView خودت رو Bind کردی برای همین شاید مشکل از همون sabtterm_Load باشه. کد sabtterm_Load رو قرار بده.
مرسی
اتفاقا من هم گرید خودم رو از طریق ویزارد به بانک وصل کردم به همین شکلی که شما توضیح داده بودی:متعجب:
یعنی چی که خودم گرید رو bind کردم (چقدر بده آدم ناشی باشه) ؟
من اون خط sabtterm_Load رو هم برداشتم و برنامه رو دوباره اجرا کردم خب طبیعی بود که همون لحظه error نداد باید فرم رو ببندم و وقتی که دوباره بازش می کنم با همون error مواجه می شم

sara_mp
پنج شنبه 12 آذر 1388, 22:01 عصر
سلام دوست عزیز
ببین این کد ها بدردت میخورن
شما برای ذخیره عکس باید در جدولتون دو تا فیلد تعریف کنید یکیش از نوع nvarchar با حداقل 200 کاراکتر که مسیر رو ذخیره میکنه ویکیش از نوع image که عکس رو به صورت باینری ذخیره میکنه.
حال یک متد به صورت زیر تعریف کنید و در کلاس فرمتون بزارید

byte[] ReadFile(string sPath)
{
byte[] data = null;
FileInfo fInfo = new FileInfo(sPath);
long numBytes = fInfo.Length;
FileStream fStream = new FileStream(sPath, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fStream);
data = br.ReadBytes((int)numBytes);
return data;
}

حالا یک کنترل picturebox بزارید و یه دکمه بزارید با استفاده از openfiledialog عکستون رو از روی هارد بخونید و در یک کنترل image نشون بدید این هم کدش:

private void openfile_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "text file (*.jpg)|*.jpg|all files (*.*)|*.*";
openFileDialog1.FilterIndex = 1;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{

strfilename = openFileDialog1.FileName;
pictureBox1.Image = Image.FromFile(openFileDialog1.FileName);

}

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

private string strfilename;


حالا یه دکمه بزارید که کار ذخیره کردن رو انجام بده به صورت زیر:
یادتون باشه که ImageOriginalPath همون فیلد بانکتونه که مسیر رو ذخیره میکنه و ImageData هم عکس رو به صورت بایناری ذخیره میکنه

private void savefile_Click(object sender, EventArgs e)
{

try
{

byte[] imageData = ReadFile(strfilename);

SqlConnection objConnection = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath + "\\testimage.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
SqlCommand objCommand = new SqlCommand();
objCommand.Connection = objConnection;
objCommand.CommandText = "INSERT INTO t1 (ImageOriginalPath, ImageData)VALUES(@ImageOriginalPath, @ImageData)";
objCommand.Parameters.Add(new SqlParameter("@ImageOriginalPath", (object)strfilename));
objCommand.Parameters.Add(new SqlParameter("@ImageData", (object)imageData));
objConnection.Open();
objCommand.ExecuteNonQuery();
MessageBox.Show("save");
objConnection.Close();

}
catch (Exception msg)
{
MessageBox.Show("" + msg.Message);
}

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

String connectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath + "\\testimage.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
SqlConnection con = new SqlConnection(connectionString);
con.Open();
string strquery = "select imagedata from t1";
SqlDataAdapter da = new SqlDataAdapter(strquery, con);
DataSet ds = new DataSet();
DataTable dt = new DataTable();
da.Fill(dt);

dataGridView1.DataSource = dt;
con.Close();
foreach (DataGridViewRow x in dataGridView1.Rows)
{
x.Height = 150;

}
foreach (DataGridViewColumn x in dataGridView1.Columns)
{
x.Width = 100;
}

یادتون نره کانکشن ها رو درست کنید.

saeeedft
پنج شنبه 12 آذر 1388, 22:18 عصر
ندا خانم، من اون روز هم بهتون گفتم، مشکل عکس فرم دومه، هیچی تو بانک شما برا عکس ثبت نمیشه، باید اون کد یه تغییراتی بکنه، اگه تونستم تغییرش بدم حتما براتون میذارمش

neda_dela
جمعه 13 آذر 1388, 12:30 عصر
[quote=sara_mp;861043]سلام دوست عزیز
ببین این کد ها بدردت میخورن
شما برای ذخیره عکس باید در جدولتون دو تا فیلد تعریف کنید یکیش از نوع nvarchar با حداقل 200 کاراکتر که مسیر رو ذخیره میکنه ویکیش از نوع image که عکس رو به صورت باینری ذخیره میکنه.
حال یک متد به صورت زیر تعریف کنید و در کلاس فرمتون بزارید

منظورتون از کلاس فرم اینجاست:


namespace WindowsApplication3
{
publicpartialclassForm2 : Form
{


و در یک کنترل image نشون بدید
من کنترل image list دیدم اما image ندیدم:متفکر:

private void openfile_Click(object sender, EventArgs e)
private void savefile_Click(object sender, EventArgs e)

من توی event های open file dialog و save ... چیزی به اسم click ندیدم
راستی یه چیز دیگه جسارتا از این به بعد کد هاتون رو توی تگ [code] بذارین. توی این علامت # بالای صفحه وقتی که می خوای پست جدید بذاری. این طوری کد هات قشنگ تر نمود می کنه:لبخندساده::قلب:

mosi_asgari
شنبه 14 آذر 1388, 22:28 عصر
مرسی
اتفاقا من هم گرید خودم رو از طریق ویزارد به بانک وصل کردم به همین شکلی که شما توضیح داده بودی:متعجب:


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

می تونم یک سوال بپرسم ؟؟؟ در sabtterm_Load چه کدی نوشتید؟ خودم می دونم که می خواهید دوباره GridView خودتون رو با داده های جدید نمایش بدید :چشمک: اما می خواهم کدش رو هم پست کنید.

بازم یک چیزه دیگه بگم؟؟؟ چرا برای Load کردن GridView خودتون sabtterm_Load رو صدا میزنید؟؟؟ خوب چرا براش یک متد جداگونه درست نمیکنید؟ اینجوری کد شما خوانا تر می شه تازه این روش اصولی تر هم هست.من حدس می زنم که sabtterm_Load شما مربوط به رویداد Load فرم شما می باشد و شما برای Load کردن دوباره دادهاتون در GridView دوباره این متد رو صدا میزنید ( این متد مربوط به هندل کردن رویداد Load می باشد و درست نیست که همانند یک متد اون را فراخوانی کنید.علاوه بر اون شما مجبورید به این متد دو پارامتر اضافی هم پاس کنید. منظورم همون sender و e میباشد. )

من تمام کارهایی که میگید رو خودم تست کردم و هیچ مشکلی نداره.من یک فرم درست کردم توش DataGridView و PictureBox و یک Button داشت.من ابتدا تو Form_Load داده های دیتابیس رو تو GridView نمایش دادم بعد یک عکس تو PictureBox قرار دادم.بعد در رویداد کلیک Button یک کد دقیقا مانند کد شما که از MemoryStream استفاده کرده بودید نوشتم که عکس را از PictureBox در MemoryStream ذخیره میکرد سپس یک سطر به دیتابیس اضافه می کردم ( این عکس رو هم در دیتابیس ذخیره می کردم) بعد دوباره GridView رو Load میکردم و همه چیز درست کار می کرد و عکس ها رو هم نشون میداد.

GridView رو هم بقول شما توسط ویزارد Bind کردم.

حالا دیگه من نمیدونم دیگه باید چی کار کنم. اگه بازم سعی کردی و درست نشد بگو تا این برنامه تستی رو هم ارسال کنم به email شما تا باورت بشه :بامزه: که همه چیز درسته.

من بازهم میگم و 100% مطمئن هستم که عکس شما در DB ذخیره شده چون من هم مانند کد شما استفاده کردم بعلاوه اینکه در دیتابیس هم نشون می ده ( با همون <Binary> ) پس مشکل از جای دیگه ایه!

فعلا :چشمک:

neda_dela
یک شنبه 15 آذر 1388, 14:55 عصر
خوب من هم از طریق ویزارد وصل کردم و عکس ها رو نشون داد و مشکلی نداشت. :متفکر:

می تونم یک سوال بپرسم ؟؟؟ در sabtterm_Load چه کدی نوشتید؟ خودم می دونم که می خواهید دوباره GridView خودتون رو با داده های جدید نمایش بدید :چشمک: اما می خواهم کدش رو هم پست کنید.

بازم یک چیزه دیگه بگم؟؟؟ چرا برای Load کردن GridView خودتون sabtterm_Load رو صدا میزنید؟؟؟ خوب چرا براش یک متد جداگونه درست نمیکنید؟ اینجوری کد شما خوانا تر می شه تازه این روش اصولی تر هم هست.من حدس می زنم که sabtterm_Load شما مربوط به رویداد Load فرم شما می باشد و شما برای Load کردن دوباره دادهاتون در GridView دوباره این متد رو صدا میزنید ( این متد مربوط به هندل کردن رویداد Load می باشد و درست نیست که همانند یک متد اون را فراخوانی کنید.علاوه بر اون شما مجبورید به این متد دو پارامتر اضافی هم پاس کنید. منظورم همون sender و e میباشد. )

من تمام کارهایی که میگید رو خودم تست کردم و هیچ مشکلی نداره.من یک فرم درست کردم توش DataGridView و PictureBox و یک Button داشت.من ابتدا تو Form_Load داده های دیتابیس رو تو GridView نمایش دادم بعد یک عکس تو PictureBox قرار دادم.بعد در رویداد کلیک Button یک کد دقیقا مانند کد شما که از MemoryStream استفاده کرده بودید نوشتم که عکس را از PictureBox در MemoryStream ذخیره میکرد سپس یک سطر به دیتابیس اضافه می کردم ( این عکس رو هم در دیتابیس ذخیره می کردم) بعد دوباره GridView رو Load میکردم و همه چیز درست کار می کرد و عکس ها رو هم نشون میداد.

GridView رو هم بقول شما توسط ویزارد Bind کردم.

حالا دیگه من نمیدونم دیگه باید چی کار کنم. اگه بازم سعی کردی و درست نشد بگو تا این برنامه تستی رو هم ارسال کنم به email شما تا باورت بشه :بامزه: که همه چیز درسته.

من بازهم میگم و 100% مطمئن هستم که عکس شما در DB ذخیره شده چون من هم مانند کد شما استفاده کردم بعلاوه اینکه در دیتابیس هم نشون می ده ( با همون <Binary> ) پس مشکل از جای دیگه ایه!

فعلا :چشمک:

در sabtterm_Load چه کدی نوشتید؟
من متد خاصی ننوشتم هر فرمی که ساخته میشه این متد رو با خودش داره و میشه صداش زد
حالا بازم امتحان می کنم ببینم چی میشه مرسی