PDA

View Full Version : سوال: نمایش تصویر ip camera در pictureBox



ghasem110deh
چهارشنبه 25 فروردین 1395, 08:51 صبح
سلام به همه :)
دوستان واسه نمایش همزمان تصاویر چند دوربین (ip camera) موجود در یک شبکه محلی (با رنج ip یکسان) دنبال راهکار مناسب میگردم !
در حال حاضر فقط میتونم با گرفتن ip و یوزر ، پس ... یه دوربین رو نشون بدم

توی نمونه مشابه ای که هست و با wpf کار شده ip و یوزر ، پس دوربین با یک عنوان ذخیره میشه و بعد عنوان دوربین دلخواه از لیست باکس کشیده میشه توی یه جدول چند خونه که توسط کاربر ایجاد میشه و احتمالا pictureBox هست (که متاسفانه wpf بلد نیستم) و دوربین نمایش داده میشه

حالا من باید اطلاعات دوربین رو بگیرم و توی دیتابیس با یه آیدی و عنوان ذخیره کنم و بعد ، بریزم توئی لیست باکس
و به تعداد آیتم های لیست باکس (در حین اجرای برنامه) pictureBox به فرم اضافه کنم (و ترتیب و چینش شون هم بهم نخوره)

و مشکل دیگه هم اینه که واسه بزرگنمایی تصویر یه فرم جدید میسازم و تصویر رو که در واقع یک image هست رو پاس میدم به pictureBox ی که داک شده (و تصویر رو بزرگ نشون میدم) که به نظرم هم روش خوبی نیست و هم اگه تعداد دوربین بره بالا چی !!؟
یا اینکه وقتی روی یه pictureBox دابل کلیک میشه اون pictureBox رو داک کنم و بیارم جلوی بقیه کنترل ها و بلعکس (با دوبار کلیک از داک برگرده و بره سر جاش)

تشکر ...

ghasem110deh
شنبه 28 فروردین 1395, 03:16 صبح
سلام به همه :)
دوستان تصویر ضمیمه رو نگاه بفرمایید !
من الان با ip ، یوزر و پس ... تصویر دوربین رو میگیرم و با یه عنوان (اسم دلخواه واسه دوربین) توی دیتابیس ذخیره میکنم

و فهرست دوربین ها و اطلاعات شون رو توی دیتاگریدویو نشون میدن (البته یوزر و پس مخفی هستن)
و با توجه به تعداد دوربین های ذخیره شده (تعداد سطرهای دیتاگریدویو) pictureBox درست میشه

حالا میخوام با دوبار کلیک روی هر سطر از دیتاگریدویو (با توجه به ID) اطلاعاتش رو پاس بدم به pictureBox اول و بعد دوم و تا اخر ...
نام pictureBox ها هم "Id + pictureBox" یعنی اینطوریه :
pictureBox1
pictureBox2
.
.
.

اما مشکل اصلیم اینه که با لود شدن برنامه نیازی نباشه دوباره کاربر روی سطرها دابل کلیک کنه تا تصاویر رو ببینه ، بلکه از اطلعات ذخیره شده استفاده کنه
سوال : اینجا باید یه جدول دیگه درست کنم !!؟ یا ...

Mahmoud Zaad
شنبه 28 فروردین 1395, 03:37 صبح
سلام
من دقیقاً متوجه نشدم، مگه شما آی دی ها رو توی گرید ندارید؟ اگه دارید که با یه حلقه میشه به ازای همه سطرهای گرید، پیکچرباکس درست کرد و تصاویر مورد نظر رو توش نشون داد.
اگه ممکنه دقیقتر توضیح بدید یا اینکه از اون نمونه ای که میگید یه تصویر بذارید.

ghasem110deh
شنبه 28 فروردین 1395, 05:11 صبح
سلام
من دقیقاً متوجه نشدم، مگه شما آی دی ها رو توی گرید ندارید؟ اگه دارید که با یه حلقه میشه به ازای همه سطرهای گرید، پیکچرباکس درست کرد و تصاویر مورد نظر رو توش نشون داد.
اگه ممکنه دقیقتر توضیح بدید یا اینکه از اون نمونه ای که میگید یه تصویر بذارید.

یکچرباکس ها رو به تعداد دوربین ها (سطرها) رست میکنم ... حالا میخوام با دوبار کلیک روی هر سطر یه پیکچر باکس انتخاب بشه و داخلش تصویر اون دوربین نمایش داده بشه !
چون الان چند هفت تات پیکچرباکس دارم
پیکچر باکس ها رو اینطوری درست میکنم (توی یه پنل) :


private void addPictureBox()
{
panel1.Controls.Clear();
int max = dataGridView1.RowCount;
for (int i = 0, x = 0, y = 0; i < max; i++)
{
pb.Location = new Point((185 * x), y);
pb.Name = "pictureBox" + i.ToString();
pb.Size = new Size(180, 165);
pb.SizeMode = PictureBoxSizeMode.AutoSize;
pb.BorderStyle = BorderStyle.FixedSingle;
//pb.Anchor = AnchorStyles.None;
pb.TabStop = false;
// pb.Click += new EventHandler(this.pictureBox_Click); //
panel1.Controls.Add(pb);
x++;
if (x == panel1.Width / 180)
{
x = 0;
y = y + 170;
}
}
}

ژیار رحیمی
شنبه 28 فروردین 1395, 05:27 صبح
سلام
این جور برنامه ها اگر با wpf بنویسی به مراتب قابلیت های بیشتری رو خواهی داشت و به آسونی مشکلات بزرگنمایی و امثال آن رو نخواهی داشت.برنامه شما با یک Thread جواب گوی نیاز شما نخواهد بود حتما به تعداد دوربین ها از Thread استفاده کن و همچنین الگوی طراحی Singleton رو پیاده سازی کن.
اما در جواب سوال شما.کافی در یک تایع رکوردهای موجود در دیتابیس رو بخونی و با حلقه for پیکچرباکس ها رو بسازی و دو در دیتاگرید نمایش بدی.وتابع رو در رویداد لود فراخوانی کنی.

ghasem110deh
شنبه 28 فروردین 1395, 10:12 صبح
ممنون :)

الان یه مشکل پیش اومد
یکی این خطا : (عکس ضمیمه)

و اینکه چطور تصویر دوربین رو به یکی از پیکچرباکس هایی که هنگام لود_فرم ساخته شدن پاس بدم !؟
الان اگه خطا نده ... توصیر توی همه پیکچرباکس ها میوفته

reza_ali202000
شنبه 28 فروردین 1395, 10:29 صبح
سلام دوست عزیز
به نظرم بهتره این کارا رو انجام بدی.
برا هر دوربین شماره نمایش در نظر بگیری. در واقع به طور پیش فرض همون ردیف گریدویو. توی دیتابیس یه فید شماره نمایش ذخیره کن.(البته فقط برا بار اول این اتفاق نیازه بیافته یعنی زمانی که دوربین تازه میخواد به گریدویو ادد بشه و بتونی یوزر و پس رو توی دیتابیس ذخیره کنی.)
حالا مثلا کاربر روی دیتاگرید رکورد دوم کلیک میکنه تا توی پیکچر اول نمایش داده بشه. خوب عدد نمایش دوربین توی دیتابیس میشه عدد 1 و فیلد نمایش میشه ترو.
حالا میخوای پیکچرباکس درست کنی برا نمایش دوربین هایی که فیلد نمایششون ترو هست. یه سلک میکنی اونایی که ترو هستن و سورت میکنی بر اساس عدد نمایششون.
یه حلقه مینویسی که از این سلکتی که با مشخصات بالا انجام دادی شروع کنه پیکچرباکس ساختن و دوربینها رو به ترتیب توی اونا قرار بده.

کارای بالا رو که انجام دادی و مطمعا شدی درسته(البته احتمالا هنگ میکنه) حالا بیا به صورت بک گروندورکر پیاده کن و یه فریم کوچو درست کن که دوربین رو انتخاب کرد بیاد رو صفحه که لطفا صبر کنید...

ghasem110deh
یک شنبه 29 فروردین 1395, 12:56 عصر
دوستان این خطا واسه چیه !؟ http://barnamenevis.org/attachment.php?attachmentid=140040&d=1460787053 توی این فرم اصلیم این خطا رو میده ... در صورتی که توی فرم اتصال به دوربین بدون مشکل به دوربین وصل میشه !

reza_ali202000
یک شنبه 29 فروردین 1395, 17:27 عصر
سلام
کامپیوتر نمیتونه تشخیص بده که ادرس مورد نظر url هس یا uri.
حالا url که میدونید چی هس و uri در واقع ادرسی هس که توی url قرار میگیره.
url:http://www.ggg.com
url:http://www.ggg.com/img/pic2/index.aspx
uriآدرس بالا:img/pic2/index.asp
برا حل این مشکل یه پروتوکل مثل http یا ftp رو اول urlهاتون(همون ای پی ادرساتون) اضاف کنید.
انشالله درست میشه.

reza_ali202000
یک شنبه 29 فروردین 1395, 17:29 عصر
راستی برنامتون رو run as admin هم کنید

reza_ali202000
یک شنبه 29 فروردین 1395, 17:32 عصر
میتونید از کد زیر برا حل این مشکل استفاده کنید.
string original = reviews[e.Item.ItemIndex].URL.ToString();
if (!original.StartsWith("http:"))
original = "http://" + original;
Uri uri;
if (!Uri.TryCreate(original, UriKind.Absolute, out uri)) {
//Bad bad bad!
}