PDA

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



رامین مرادی
شنبه 19 بهمن 1398, 08:41 صبح
سلام دوستان وقت بخیر.
من نیاز دارم تصویر کوچکی از یه سری تصاویر ذخیره شده تو مسیر شبکه رو نشون بدوم. اندازه تصویری که قراره نشون بدم 118*118 هست.
ولی خب خودتون بهتر میدونید تو سی شارپ بخواید تصاویر رو نشون بدید با افت شدید سرعت مواجه میشید. مخصوصا تعداد تصاویر اگه بیشتر از 10 تا باشه. حافظه رو هم به شدت پر میکنه.
من با کد زیر هم تست کردم ول باز همون آش و همون کاسه.(کنترل تصاویر به تعداد تصاویر موجود در حافظه در حین اجرا ایجاد میشه.توسط یه حلقه)

Image image = Image.FromFile(AppSeetingClass.GetAppDir() + dataTable.Rows[i]["FileName"].ToString());
Image thumb = image.GetThumbnailImage(120, 120, () => false, IntPtr.Zero);
pictureBox.Image = thumb;

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

the king
شنبه 19 بهمن 1398, 16:10 عصر
سلام دوستان وقت بخیر.
من نیاز دارم تصویر کوچکی از یه سری تصاویر ذخیره شده تو مسیر شبکه رو نشون بدوم. اندازه تصویری که قراره نشون بدم 118*118 هست.
ولی خب خودتون بهتر میدونید تو سی شارپ بخواید تصاویر رو نشون بدید با افت شدید سرعت مواجه میشید. مخصوصا تعداد تصاویر اگه بیشتر از 10 تا باشه. حافظه رو هم به شدت پر میکنه.
من با کد زیر هم تست کردم ول باز همون آش و همون کاسه.(کنترل تصاویر به تعداد تصاویر موجود در حافظه در حین اجرا ایجاد میشه.توسط یه حلقه)

Image image = Image.FromFile(AppSeetingClass.GetAppDir() + dataTable.Rows[i]["FileName"].ToString());
Image thumb = image.GetThumbnailImage(120, 120, () => false, IntPtr.Zero);
pictureBox.Image = thumb;

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

پروژه ای که در تاپیک عدم نمایش عکس ها (https://barnamenevis.org/showthread.php?558420-%D8%B9%D8%AF%D9%85-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-%D8%B9%DA%A9%D8%B3-%D9%87%D8%A7&p=2424711&viewfull=1#post2424711) قرار داده بودم رو که لابد دیدید.

کلا برای افزایش سرعت در پردازش تصویر می توانید از Magick.NET-Q8 (https://www.nuget.org/packages/Magick.NET-Q8-x64/) یا ImageProcessor (https://imageprocessor.org/)استفاده کنید ولی برای مواردی که تصویر بزرگی ایجاد می کنید مزیت ایجاد می کنند، نه تصاویر کوچک.
اگه سرعتشون رو با Image.GetThumbnailImage مقایسه کنید، Image.GetThumbnailImage سریعتر از هر دو شون عمل می کنه چون سربار تبدیل به Image و Bitmap ای که اونها دارند رو نداره.

Mahmoud.Afrad
شنبه 19 بهمن 1398, 21:45 عصر
سلام دوستان وقت بخیر.
من نیاز دارم تصویر کوچکی از یه سری تصاویر ذخیره شده تو مسیر شبکه رو نشون بدوم. اندازه تصویری که قراره نشون بدم 118*118 هست.
ولی خب خودتون بهتر میدونید تو سی شارپ بخواید تصاویر رو نشون بدید با افت شدید سرعت مواجه میشید. مخصوصا تعداد تصاویر اگه بیشتر از 10 تا باشه. حافظه رو هم به شدت پر میکنه.
من با کد زیر هم تست کردم ول باز همون آش و همون کاسه.(کنترل تصاویر به تعداد تصاویر موجود در حافظه در حین اجرا ایجاد میشه.توسط یه حلقه)

Image image = Image.FromFile(AppSeetingClass.GetAppDir() + dataTable.Rows[i]["FileName"].ToString());
Image thumb = image.GetThumbnailImage(120, 120, () => false, IntPtr.Zero);
pictureBox.Image = thumb;

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

اگر این کد روی کلاینت اجرا بشه خب منطقی هست که حافظه و زمان زیادی ببره چون تصویر کامل باید به کلاینت منتقل بشه تا بعد تصویر بندانگشتی ساخته بشه. اگر بتونید تصویر بندانگشتی را روی سرور بسازید و ارسال کنید بهتر میشه یا حتی تصاویر بندنگشتی را روی سرور ذخیره(کش) کنید.
از صفحه بندی و نمونه کد the king (https://barnamenevis.org/member.php?259237-the-king) هم برای تعداد زیاد تصاویر میتونید استفاده کنید

رامین مرادی
یک شنبه 20 بهمن 1398, 14:50 عصر
اگر این کد روی کلاینت اجرا بشه خب منطقی هست که حافظه و زمان زیادی ببره چون تصویر کامل باید به کلاینت منتقل بشه تا بعد تصویر بندانگشتی ساخته بشه. اگر بتونید تصویر بندانگشتی را روی سرور بسازید و ارسال کنید بهتر میشه یا حتی تصاویر بندنگشتی را روی سرور ذخیره(کش) کنید.
از صفحه بندی و نمونه کد the king (https://barnamenevis.org/member.php?259237-the-king) هم برای تعداد زیاد تصاویر میتونید استفاده کنید

نمونه کد ایشون رو موقع دانلود ویروس میشناسه :افسرده: نتونستم دانلود کنم.
پس یعنی موقع کپی تصویر تو سرور یه نمونه بند انگشتی هم براش ایجاد کنم تا حداقل برای بهبود این عملیات ازش استفاده کنم؟(حجم هم برام مساله شده و به مرور زمان این حجم زیاد میشه.فعلا حدود 90 گیگ هست.) و برای اینکه همزمان تصاویر زیادی لود نشه از صفحه بندی استفاده کنم و با ترکیب این دوتا بتونم نتیجه مورد قبولتری بگیرم.(خودم این روش رو به بقیه پیشنهاد میدم فقط چون تعداد تصاویر نسبتا کم هستن تو گروه ها برا همین سعی کردم استفاده نکنم )
فقط یه مسئله من موقع نمایش تصاویر پیکجر باکس رو در زمان اجرا ایجاد میکنم. بهتره به تعداد محدود این کنترل رو روی فرم بزارم یا همون موقع اجرا ایجاد کنم؟ تو روش دوم بحث از بین بردن کلاس های بلا استفاده هم پیش میاد که خب اونم یه کم دردسر میشه.

the king
یک شنبه 20 بهمن 1398, 19:57 عصر
نمونه کد ایشون رو موقع دانلود ویروس میشناسه :افسرده: نتونستم دانلود کنم.
پس یعنی موقع کپی تصویر تو سرور یه نمونه بند انگشتی هم براش ایجاد کنم تا حداقل برای بهبود این عملیات ازش استفاده کنم؟(حجم هم برام مساله شده و به مرور زمان این حجم زیاد میشه.فعلا حدود 90 گیگ هست.) و برای اینکه همزمان تصاویر زیادی لود نشه از صفحه بندی استفاده کنم و با ترکیب این دوتا بتونم نتیجه مورد قبولتری بگیرم.(خودم این روش رو به بقیه پیشنهاد میدم فقط چون تعداد تصاویر نسبتا کم هستن تو گروه ها برا همین سعی کردم استفاده نکنم )
فقط یه مسئله من موقع نمایش تصاویر پیکجر باکس رو در زمان اجرا ایجاد میکنم. بهتره به تعداد محدود این کنترل رو روی فرم بزارم یا همون موقع اجرا ایجاد کنم؟ تو روش دوم بحث از بین بردن کلاس های بلا استفاده هم پیش میاد که خب اونم یه کم دردسر میشه.
خیلی تفاوتی نداره که در زمان اجرا PictureBox میسازید یا نه، مهم اینه که وقتی دیگه لازمشون ندارید و میخواهید حذف شون کنید Dispose کردن یادتون نره. اگر Dispose شدن انجام بشه در زمان اجرا هم بسازید مشکلی پیش نمیاد.