PDA

View Full Version : سوال: ذخیره عکس از وبکم در دیتابیس



Ramin_khan
سه شنبه 09 دی 1393, 17:14 عصر
سلام
من در حال نوشتن یک نرم افزار تردد پارکینگ هستم
توضیح مختصری راجب برنامه میدم و نیاز فوری به کمک دارم در قسمت تصویر

وقتی ماشین جلوی درب پارکینگ می ایستد تقریبا محل پلاک در دید دوربینی است که به کامپیوتر وصل شده(وب کم)
و زمانی که کاربر کارت را میزند تاریخ و ساعت ورود به همراه تصویر وب کم ذخیره می شود(در همان لحظه کارت زدن از وب کم عکس میگیرد)
برای عکس برداری من از کامپوننت TVideoGrabber استفاده کردم و تقریبا تا اینجا مشکلی ندارم
برای ذخیره ابتدا تصویر VideoGrabber را در یک فایل از نوع bmp در یک پوشه ذخیره می کنم و بلافاصله همون تصویر را از پوشه فراخوانی کرده و در دیتابیس ذخیره می کنم!!
حال مشکل اینجاست که VideoGrabber تصویر را با کمی تاخیر چند میلی ثانیه یا یک ثانیه ای ذخیره می کند و در این زمان مرحله دوم اجرا شده و عکس فراخوانی می شود(یعنی تا عکس جدید ذخیره شود عکس قبلی فراخوانی و در دیتابیس ذخیره می شود)
در عملکرد عکس ماشین قبلی به جای ماشین جدید ذخیره می شود

حالا نمیدونم روش من اشتباه هست یا مشکل از این کامپوننت هست؟
آیا کسی کامپوننت و روش دیگه ای سراغ داره که بشه عکس از وب کم رو راحت تر گرفت؟

یا کسی می تونه کمک کنه تا تصویر گرفته شده از وب کم را مستقیم در دیتابیس ذخیره کنم؟

Ramin_khan
سه شنبه 09 دی 1393, 17:26 عصر
در حالت عادی نتونستم تصویر گرفته شده از وب کم رو توی دیتابیس ذخیره کنم!

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

یه روشی که بشه راحت وب کم رو فعال کرد و تصویرش رو ذخیره کرد(فقط عکس) توی SQL

یوسف زالی
سه شنبه 09 دی 1393, 20:00 عصر
برای ذخیره ابتدا تصویر VideoGrabber را در یک فایل از نوع bmp در یک پوشه ذخیره می کنم و بلافاصله همون تصویر را از پوشه فراخوانی کرده و در دیتابیس ذخیره می کنم

استریم برای همین کارهاست.




حال مشکل اینجاست که VideoGrabber تصویر را با کمی تاخیر چند میلی ثانیه یا یک ثانیه ای ذخیره می کند و در این زمان مرحله دوم اجرا شده و عکس فراخوانی می شود


مگه با تایمر کار کردید؟؟؟
شما باید در یک حلقه وجود فایل رو چک کنید (در روشی که خودتون کار کردید) و اگر فایل موجود بود ادامه بدید.

Ramin_khan
سه شنبه 09 دی 1393, 21:48 عصر
استریم برای همین کارهاست.



مگه با تایمر کار کردید؟؟؟
شما باید در یک حلقه وجود فایل رو چک کنید (در روشی که خودتون کار کردید) و اگر فایل موجود بود ادامه بدید.

ممنون میشم اگر بفرمایید چطوری باید با استریم کار کنم،من باید این مشکل رو تا فردا ظهر حل کنم،یه مقدار هم مطالعه کردم در باره استریم ولی چیز خاصی دستگیرم نشد

نه با تایمر کار نکردم،ولی هردفعه که عکس میگیره روی عکس قبلی میزنه و فایل عکس همیشه وجود داره!

یوسف زالی
چهارشنبه 10 دی 1393, 09:44 صبح
دو تا راه فوری دارید:
فایل رو به نامی یونیک ذخیره کنید، مثلا تاریخ و زمان یا GUID و ...
می تونید از روال های ذخیره در استریم خود کامپوننت (در صورت ارائه) استفاده کنید. بگردید ببینید SaveToStresm داره یا نه؟
اگر در استریم ذخیره کنید همون استریم رو در اس کیو ال ذخیره می کنید.

Ramin_khan
چهارشنبه 10 دی 1393, 11:58 صبح
خیر savetostream نداره!
یه روش دیگه یا کامپوننت دیگه برای این کار نمشناسید؟
چند تا کامپوننت هم خودم گشتم ولی با اونا هم نشد!
اون حلقه هم جواب نداد،برنامه وارد یک حلقه بینهایت میشه و فایل درست نمیشه!
دقیقا معلوم نیست کی عکس رو ثبت می کنه!
به محض این که کارت به دستگاه reader نزدیک میشه اون خط اجرا میشه ولی عکس گرفته نمیشه!

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

Mask
پنج شنبه 11 دی 1393, 01:08 صبح
دقت نکردی برادر یوسف چی فرمودند.
برای رفع این مشکلتون راحتترین راه اینه که اسم فایلهاتون رو یونیک کنید و دوم اینکه عکسهاتون رو jpg ذخیره کنید، bmp که حجمش بالاست.

Ramin_khan
شنبه 20 دی 1393, 12:01 عصر
این مشکل رو حل کردم با استفاده از یک تایمر با Interval=500 که میره و عکس رو میخونه
عکس رو هم تبدیل به jpg می کنم و ذخیره می کنم حجمش بهتر شده ولی به نظرم بازم زیاده!

حالا یه مشکل دیگه پیدا شده:
وقتی کاربری میخواد اطلاعات رو از سرور بخونه و گزارش بگیره اگر فیلد عکس توی گزارش نباشه که بدون وقفه زمانی میاره ولی وقتی فیلد عکس توی select باشه خیلی زمان زیادی طول می کشه،این مشکل در زمان درج اطلاعات هم وجود داره
اگر تعداد رکورد ها به 1000 تا برسه این تاخیر حدود 5 ثانیه و وقتی رکورد ها به 10000 میرسه حدود 20 ثانیه طول میکشه که خیییلی زیاده!!!!!

حالا نمیدونم باید چکار کنم
آیا ایندکس کردن مشکل رو حل می کنه؟ ایندکس رو روی چه فیلدی بزنم؟اصلا چطوری باید ایندکس بزنم؟

البته لازم به ذکر هست که بگم مشکل سرعت فقط از توی برنامه نیست،حتی وقتی توی SQL Query Analyzer هم select میزنم بازم سرعت خیلی پایینه و همین زمان قبلی طول میکشه!!!!
مشکل هم سر اون جدولی هست که عکس توش ذخیره می شه

hadisalahi2
دوشنبه 22 دی 1393, 15:49 عصر
خوب معلومه طول میکشه عزیزم
کلا روش ذخیره تصاویر در داخل بانک اطلاعاتی ، یک کار غیر استاندارد و غیر اصولی هستش

برای بالا رفتن این کار میتونی فقط آدرس تصویر رو ذخیره کنی

در ضمن میتونی از File Stream در Sql Server 200 R2 به بعد هم استفاده کنی

اما ساده ترین راه ذخیره آدرس تصویر در جدول هستش نه خود عکس

بعد از 6 ماه استفاده از این روش ، اونقدر حجم بانک بالا میره که عملا دیگه نمیتونی ازش استفاده کنی

دقیقا مثل مشکلی که من با یک برنامه اتوماسیون داشتم و راه دوم رو انتخاب کردم
الانم با گذشت 4 سال از زمان استفاده از اون برنامه ، حجم بانک هنوز به 300 مگ هم نرسیده

یا حق

Ramin_khan
دوشنبه 29 دی 1393, 17:04 عصر
تشکر hadisalahi2 (http://barnamenevis.org/member.php?54383-hadisalahi2)
ولی 2 تا مساله هست:
1-اگر آدرس رو ذخیره کنم باید تصاویر در هارد کامپیوتر سرور ذخیره بشه مثلا در C:\Pic درسته؟
حالا اگر یکی از کلاینت ها بخواد در جای دیگری این تصویر یا تصاویر رو نمایش بده چطور میتونه به C:\pic سرور دسترسی داشته باشه؟
آیا با MAP کردن مشکل حل میشه؟
سوال دیگه این که برای نمایش یک تصویر آدرس اون رو ارسال می کنه و نمایش میده،حالا اگر بخوام توی fastreport مجموعه تصاویر را نمایش بده باید چکار کرد؟(این برام سوال شده واقعا) مثلا در یک بازه زمانی؟!؟
2-مساله دوم این که این مشتری من نمیخواد فایل تصاویر در هارد ذخیره بشه که به اصطلاح کاربرش بتونه فایل ها رو ببینه یا برداره!!!!
خوب برای مشتری عادی من از روشی که شما معرفی کردید استفاده می کنم ولی برای این مشتری چه کاری میشه انجام داد؟

Ramin_khan
دوشنبه 29 دی 1393, 17:07 عصر
یک نکته جالب این که یه نمونه برنامه الان همین مشتری داره باهاش کار میکنه که به سورس دسترسی ندارم اونم با دلفی 7 نوشته شده و به همین روش تصاویر رو در دیتابیس ذخیره و بازیابی می کنه
وقتی هم از خود SQL Query Analyzer استفاده میکنم و میزنم select * from table با وقفه زمانی و حدود 20 ثانیه مکث 1000 رکورد رو نمایش میده
ولی جالبش اینجاست که وقتی از دل برنامه گزارش تمامی اطلاعات به همراه عکس رو میگیرم با سرعت 1 ثانیه اطلاعات رو نمایش میده!!
به نظرتون از چه روشی استفاده کرده برای نمایش اطلاعات از داخل برنامه؟!؟؟!
چون وقتی به مشتری گفتم که سرعت میاد پایین برنامه خودشو نشون داد که به راحتی داره کار میکنه:متفکر:

یوسف زالی
دوشنبه 29 دی 1393, 18:48 عصر
1- اون برنامه اگر از روش ذخیره عکس در دیتابیس استفاده کرده باشه، باید ببینید که حجم و اندازه تصاویر ذخیره شده چقدر هست.
2- استفاده از آنالایزر در اینجا بی مورده و باید با پروفایلر می دیدید که * سلکت می کنه یا این که ردیف به ردیف یا پیجینگ و ... کار می کنه.
3- ممکنه از روشهای لیزی لود استفاده شده باشه، از کامپوننت های خاص استفاده شده باشه، از مکش مرحله ای استفاده شده باشه..
4- در خصوص فولدر و اشتراک گذاشتنش، چاره دیگه ای ندارید مگر این که از روشهای بیش از دو لایه استفاده کنید و یک سرویس روی سرور ران کنید که برنامه ها به اون وصل بشن.
5- بهترین روش برای چنین کارهایی استفاده از فایل استریمینگ خود اس کیو ال هست که در 2008 به بعد معرفی شده.
6- در مورد فست ریپورت و سایر ریپورت ها می تونید با کدنویسی در رویداد BeforePrint یا AfterData یا رویدادهای دیگر شی تصویر، اون رو لود کنید، می تونید تصویر لود شده برای نمایش در گرید رو بهش پاس بدید، می تونید خودتون در هنگام مقتضی اون رو با استریم لود کنید..
7- احتمالا از اس کیو ال 2000 استفاده می کنید؟ خود این نسخه به حد کافی کند هست.

Ramin_khan
سه شنبه 30 دی 1393, 17:27 عصر
روش های زیادی معرفی کردید ولی خیلیاشو نمیدونم به چه صورت باید پیاده سازی کنم!
پروفایلر؟مکش مرحله ای؟لیزی لود؟دولایه؟ استریمینگ خود اس کیو ال؟

بله SQL 2000 هست چون نرم افزار قبلی با همین sql داره به خوبی کار میکنه
مثلا وقتی بازه زمانی یک هفته ای میدیم بهش توی گزارش حدود 400 عکس رو به راحتی میاره بدون وقفه(توی نرم افزار قبلی از فست ریپورت استفاده نشده!)
حجم تصاویر یکی هست با یک رزولوشن و یک دوربین

یوسف زالی
سه شنبه 30 دی 1393, 19:33 عصر
باید کدش رو بررسی کنم..
در مورد مطالبی که گفتم تحقیق کنید، خیلی به دردتون می خوره.
FileStreaming in SQL
Lazy Load
Paging
MultiTier programing
MultiLayer programing
و ...

hadisalahi2
چهارشنبه 01 بهمن 1393, 09:36 صبح
روش های زیادی معرفی کردید ولی خیلیاشو نمیدونم به چه صورت باید پیاده سازی کنم!
پروفایلر؟مکش مرحله ای؟لیزی لود؟دولایه؟ استریمینگ خود اس کیو ال؟

بله SQL 2000 هست چون نرم افزار قبلی با همین sql داره به خوبی کار میکنه
مثلا وقتی بازه زمانی یک هفته ای میدیم بهش توی گزارش حدود 400 عکس رو به راحتی میاره بدون وقفه(توی نرم افزار قبلی از فست ریپورت استفاده نشده!)
حجم تصاویر یکی هست با یک رزولوشن و یک دوربین

ببین داداش گلم
منم دقیقا یک برنامه نوشتم برای همین کار
عکسها رو توی سرور ذخیره میکنم
و از اونجا هم میخونم
حالا برای امنیت بیشتر ، اصلا پوشه ها رو Share نمیکنم
فقط موقعی که نیاز دارم فولد مورد نظر رو Map Drive میکنم

اطلاعات رو میخونم یا مینویسم و بعد اتصال با Map Drive رو قطع میکنم

حالا این طوری که شما میخوای پیش بری به هیچی نمیرسی
باید مرحله به مرحله کاری که تا الان انجام دادی رو بگی و مرحله بعد رو دقیق شرح بدی

بگو الان کدوم مرحله ای تا دقیق بگم چیکار کنی

یا حق

Ramin_khan
شنبه 04 بهمن 1393, 12:50 عصر
الان من دارم نرم افزار پارکینگ مینویسم
سرور SQL 2000 هست که روی کامپیوتر مدیر نصب شده
کلاینت ها هم بهش وصل میشن و در هربار که در گیت ورودی کارت زده میشه تصویر وب کم با stream در دیتابیست ذخیره میشه که فیلدش از نوع image هست
وقتی با dbgride نگاه میکنم اون فیلد محتویاتش مینویسه Blob
حالا زمانی که در گیت خروجی کارتی زده میشه شماره کارت رو توی دیتابیس select میکنم و اطلاعات کارت و عکس مربوطه رو نمایش میده
زمانی که بخوام توی گزارش ها گزارش تردد امروز رو بگیرم به راحتی نمایش میده ولی وقتی گزارش با تصویر میگیرم و به محض این که توی select اون فیلد عکس رو میارم زمان خیلی زیادی صرف میکنه تا اطلاعات رو نمایش بده،حالا این زمان به سرعت سیستم و سرعت شبکه و تعداد فیلد های جدول هم بستگی داره
طبق گفته دوستمون حجم دیتا بیس هم به مرور زمان خیلی زیاد میشه،چون شاید یه جایی در روز حدود 1000 رکورد ثبت کنه با تصویر

hadisalahi2
شنبه 04 بهمن 1393, 15:57 عصر
وقتی با dbgride نگاه میکنم اون فیلد محتویاتش مینویسه Blob

برای دیدن در گرید باید یک کم کد نویسی کنی و یا از کامپوننت هایی مثل Ehlib استفاده کنی



زمانی که بخوام توی گزارش ها گزارش تردد امروز رو بگیرم به راحتی نمایش میده ولی وقتی گزارش با تصویر میگیرم و به محض این که توی select اون فیلد عکس رو میارم زمان خیلی زیادی صرف میکنه تا اطلاعات رو نمایش بده،حالا این زمان به سرعت سیستم و سرعت شبکه و تعداد فیلد های جدول هم بستگی داره


خوب این رو که قبلا گفتم راهش چیه
باید تصاویر رو در هارد دیسک ذخیره کنی بر روی سرور و فقط آدرس تصاویر رو در فیلد مربوطه قرار بدی

کلا ذخیره تصاویر در بانک اطلاعاتی روشیه که به بن بست میخوری

خوب حالا برای ذخیره تصاویر در سرور هم چند راه داری
1- از File Stream استفاده کنی که در SQL Serve 2008 R2 به بعد اومده
2- پوشه های مورد نظرت رو روی سرور Share کنی و مستقیم اطلاعات رو توی اونها بریزی
3- از Map Drive استفاده کنی

من خودم از روش آخر استفاده میکنم.

Ramin_khan
شنبه 04 بهمن 1393, 18:04 عصر
در خصوص dbgride فقط خواستم بگم که مینویسه blob و برای نمایش از fastreport استفاده میکنم توی گزارش ها

با profiler تست کردم نرم افزار قبلی رو و یه چیز جالب دیدم
توی نرم افزار قبلی که مشکل سرعت وجود ندارد و بنده ننوشتم وقتی که گزارش میگیری select * from table میزنه و به راحتی بدون توقف اطلاعات رو نمایش میده ولی نکته جالب اینه که بعدش فورا به تعداد رکورد های جدول select * from table where card_no='1234' میزنه
به جای 1234 هر دفعه شماره یک کارت رو میزنه!!!!
ولی درکل نفهمیدم که چرا این کارو کرده و آیا این کار باعث شده در خواندن اطلاعات مشکل سرعت نداشته باشه!!!

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

Ramin_khan
شنبه 04 بهمن 1393, 18:22 عصر
127865
عکس رو نگاه کنید
همون خطی که انتخاب شده داره کار رو انجام میده،حالا وقتی همین کد رو توی SQL Query Analyzer میزنم زمان زیادی می بره ولی وقتی برنامه گزارش میگیره در حالت اجرا هیچ مشکل سرعتی نداره
اون خط های دیگه هم نمیدونم دلیلش چیه چون توی اون جدولی که داره select میزنه هیچ اطلاعاتی نیست!!!

hadisalahi2
یک شنبه 05 بهمن 1393, 09:38 صبح
من اگر بخوام اطلاعات روی دیتابیس ذخیره بشه و مشکل سرعت نداشته باشم باید چکار کنم؟

به نظر من و با میزان سوادی که من دارم ، تنها راهش اینه که از FileStream استفاده کنی که قبلا گفتم در ورژن 2008 به بعد اضافه شده
شاید اساتید نظر بهتری یا ساده تری داشته باشند

اما یک کار دیگه هم میشه کرد
اینکه شما ، فیلد عکس رو در یک جدول جداگانه بزاری و اطلاعات رو در یک جدول جدا
و Select های خودت رو از جدول اصلی بزنی که هیچ مشکلی در سرعت نخواهید داشت

و اما هر جا که لازم بود ، عکس رو از جدول مربوط به تصاویر بخونی

توی جدول تصاویر شماره کد و عکس رو ذخیره کن
هر جا هم لازم بود ، کد معادل جدول اصلی رو بخون و عکس مربوطه رو از جدول تصاویر Select کن

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

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

یوسف زالی
یک شنبه 05 بهمن 1393, 09:54 صبح
select * from table

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

misamisa
یک شنبه 05 بهمن 1393, 10:02 صبح
سلام. من توضیحاتو خوندم. بهترین برنامه استریم است. فیلمهای مربوط هم میتونید فیلمهای لاندا رو مشاهده کنید


طراحی سایت (https://www.wisam.ir/webdesign/) | سئو (https://www.wisam.ir/seo/)
سئو اینستاگرام (https://www.wisam.ir/seo/instagram-optimization/) | www.wisam.ir (https://www.wisam.ir/)
دیجیتال مارکتینگ (https://www.wisam.ir/) | سوشیال مارکتینگ (https://www.wisam.ir/)

لیپوماتیک (https://mehromahcenter.com/lipomatic/) | Mehromahcenter.com (https://mehromahcenter.com/)
نرم افزار باشگاهی (https://madaktosport.com/%d9%86%d8%b1%d9%85-%d8%a7%d9%81%d8%b2%d8%a7%d8%b1-%d8%a8%d8%a7%d8%b4%da%af%d8%a7%d9%87%db%8c/) | Madaktosport.com (https://madaktosport.com/)
لیپوماتیک مهر وماه (https://mehromahcenter.com/) | گیت ورود و خروج (https://madaktosport.com/%da%af%db%8c%d8%aa-%d9%88%d8%b1%d9%88%d8%af-%d9%88-%d8%ae%d8%b1%d9%88%d8%ac/)