استفاده از popBox برای کوچک کردن خودکار تصاویر بزرگ
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: دو دقیقه


یکی از دوستان در قسمت تماس با من پیغام گذاشته بود که چگونه تصاویر یک صفحه را می‌شود به صورت موقت کوچک کرد؟ برای نمونه، این مشکلی است که در فوروم‌ها زیاد وجود دارد. گاهی از اوقات یکی از کاربران تصویری را ارسال می‌کند که اندازه‌ی آن در حد یک تابلوی دیواری است!
با استفاده از محصول سورس بازی به نام popBox می‌توان تصاویر دلخواهی را ابتدا با اندازه‌ی کوچک در صفحه نشان داد و پس از کلیک بر روی آن، تصویر به اندازه اصلی آن نمایش داده خواهد شد. به این صورت صفحه از شکل نخواهد افتاد. این اسکریپت از آدرس زیر قابل دریافت است:
http://www.c6software.com/products/popbox/default.aspx
نحوه استفاده و مثال‌های مربوطه هم در همان آدرس قابل مشاهده است و نکته خاصی ندارد.

اما این روش یا روش‌های مشابه آن یک مشکل دارند. اعمال آن‌ها باید به صورت دستی صورت گیرد. یعنی باید دقیقا مشخص کنیم که این تصویر معلوم در ابتدا به اندازه‌ی مشخصی نمایش داده شود و سایر تنظیمات مربوطه اعمال گردد. این روش در سایت‌های پویا عملا پاسخگو نخواهد بود. زمانیکه کاربری مطلبی را ارسال می‌کند یا باید در سورس‌های موجود دست برد و به تصاویر ارسالی به صورت خودکار تنظیمات مربوط به popbox‌ را اضافه کرد، یا اینکه هر بار مطالب را پس از ارسال به صورت دستی ویرایش کرد یا روش‌هایی مانند این.

با استفاده از jQuery ، اسکریپت selectAll.js را به این مجموعه اضافه کردم. ابتدا تمامی تصاویر صفحه پیدا می‌شوند و سپس به آنهایی که طول و عرض بزرگتری از حد مجاز دارند به صورت خودکار ویژگی‌های popBox افزوده خواهد شد. چون این روش اسکریپتی است : الف) نیازی به تغییر در سورس‌های موجود نیست. ب) توسط هر تکنولوژی سمت سروری نیز قابل استفاده است. ج) به صورت خودکار به تمامی تصاویر بزرگ صفحه اعمال می‌شود و نیازی به ویرایش دستی هیچ موردی جهت اعمال ویژگی‌های مورد نظر وجود نخواهد داشت.

نکته جالبی که با jQuery وجود دارد، روال رخ‌داد گردان document.ready آن است. این رخداد پیش از window.onload استاندارد و زمانیکه DOM آماده استفاده است فراخوانی می‌شود.

برای استفاده از آن ابتدا باید دو فولدر scripts و images به سرور کپی شوند. سپس سه سطر زیر را به هدر صفحه اضافه کنید (به سورس صفحه sample.html فایل پیوست می‌توان مراجعه کرد):

<script src="scripts/jquery.min.js" type="text/javascript"></script>
<script src="scripts/PopBox.js" type="text/javascript"></script>
<script type="text/javascript" src="scripts/selectAll.js"></script>

در مورد سایر تنظیمات، فایل selectAll.js را گشوده و موارد زیر را در صورت لزوم ویرایش نمائید:
popBoxWaitImage.src = "images/spinner40.gif";
popBoxRevertImage = "images/magminus.gif";
popBoxPopImage = "images/magplus.gif";
popBoxRevertText = "کوچک‌ نمایی";
popBoxPopText = "بزرگ‌ نمایی";
popBoxCaptionMoreText = "بیشتر";
popBoxCaptionLessText = "کمتر";
MaximumAllowedWidth = 500;
MaximumAllowedHeight = 480;

در این فایل قسمتی از تابع rescaleImage از سایت stack overflow قرض گرفته شد و تغییرات لازم جهت اعمال ویژگی‌های popbox‌ به آن اعمال گردید. با استفاده از این تابع نسبت‌های طول و عرض تصویر به میزان ثابتی کوچک می‌شوند و تصویر کوچک شده با کیفیت بهتری نمایش داده خواهد شد.
موارد ذکر شده را از این آدرس می‌توانید دریافت نمائید.


  • #
    ‫۱۵ سال و ۱۱ ماه قبل، یکشنبه ۱۷ آذر ۱۳۸۷، ساعت ۲۳:۵۰
    A day without Learning is a lost day
    وحید نصیری همچنان وحید نصیری هست.
    تشکر فراوان از پشتکار شما و به اشتراک گذاشتن روزانه ی دانسته هایتان
    درود
  • #
    ‫۱۵ سال و ۱۱ ماه قبل، دوشنبه ۱۸ آذر ۱۳۸۷، ساعت ۰۰:۵۱
    با سپاس از لطف شما
    موفق باشید
  • #
    ‫۱۵ سال و ۱۱ ماه قبل، سه‌شنبه ۱۹ آذر ۱۳۸۷، ساعت ۱۳:۵۹
    سلام استاد نصیری
    با تشکر از زحمات شما
    به یه موردی که برخوردم اینه که اگر سرعت پایین باشه و عکسها زودتر از کدهای جاوا اسکریپت دانلود شده باشن این افکت عمل نمیکنه والبته من این مشکل رو قبلا با ایجکس هم داشتم.اگر شما به این سایت مراجعه کنین http://converter.telerik.com/ چنانچه کل صفحه بطور کامل لود نشده باشد با زدن دکمه به یک خطای هندل نشده برخورد میکنیم که بدلیل عدم دانلود کامل کدهای جاوا اسکریپتی است.چکار باید کرد که این مشکلت رخ ندهد؟امیدوارم منظورم رو درست بیان کرده باشم.
    موفق و موید در پناهحق باشید
  • #
    ‫۱۵ سال و ۱۱ ماه قبل، سه‌شنبه ۱۹ آذر ۱۳۸۷، ساعت ۱۴:۲۵
    سلام
    - در این مثال، خواص مربوط به popbox در document.ready مربوط به جی کوئری ست می‌شود، یعنی قبل از اینکه عکس‌ها load شوند تنظیمات ما اعمال شده.
    - اسکریپت مربوط به popbox را من فشرده نکردم. با فشرده سازی آن حجم آن نصف می‌شود که در مورد سرعت load شدن آن خیلی مؤثر است. برای این منظور می‌تونید به آدرس زیر مراجعه کنید:
    http://www.codeproject.com/KB/cs/jscompress.aspx
  • #
    ‫۱۵ سال و ۱۱ ماه قبل، پنجشنبه ۲۱ آذر ۱۳۸۷، ساعت ۰۲:۰۸
    سلام استاد نصیری
    نظرتون راجع به UpdatePanelچیه؟میشه ازش استفاده کرد در اون زمینه ای که بالا پرسیدم؟یعنی کل قسمتی که عکس داره رو بندازیم تو یه اپدیت پنل و وقتی کاملا لود شد ازش استفاده کنیم.آیا با کدهای جاوا تداخل ایجاد نمیکنه؟
    ممنون
  • #
    ‫۱۵ سال و ۱۱ ماه قبل، پنجشنبه ۲۱ آذر ۱۳۸۷، ساعت ۰۶:۰۰
    سلام
    استفاده از update panel برای اینکار مقرون به صرفه نیست. شما از یک طرف از سرعت پائین خط شکایت می‌کنید و از طرف دیگر می‌خواهید از حجم بالای اسکریپت‌های اجکس هم استفاده کنید که فقط به کاربر نشان دهید این تصویر در حال load شدن است؛ کمی صبر کنید الان نمایش داده می‌شود. مثلا چیزی شبیه به این:
    http://www.codeproject.com/KB/ajax/DelayedContentLoading.aspx

    - راه حل‌های زیادی برای حل این سربار هست. برای مثال در یک CMS که خودم نوشتم، تصاویری را که یوزر آپلود می‌کند، به صورت خودکار تبدیل به thumbnail می‌کنم (System.Drawing.Image.GetThumbnailImage). یعنی دو نسخه نگهداری می‌شود. یکی کوچک و یکی در اندازه اصلی. نسخه کوچک در صفحه اصلی گالری تصاویر نمایش داده می‌شود. پس از کلیک کاربر، با همین پاپ باکس یا یک نمونه دیگر که استفاده کردم به نام light box ، تصویر در اندازه اصلی نمایش داده می‌شود. به این صورت دیگر من نگران نحوه نمایش اولیه نخواهم بود و نمایش اولیه اسکریپتی نیست.
    سایت لایت باکس است:
    http://www.huddletogether.com/projects/lightbox2/
    استفاده از آن هم در ASP.Net ساده است. اسکریپت‌های آن به هدر اضافه می‌شوند. سپس به تگ‌های یک کنترل ایمیج یا هایپرلینک که مثلا در یک DataList قرارگرفته‌اند خواص آن اضافه می‌شود. به این صورت می‌شود یک گالری پویا را ایجاد کرد که با دیتابیس هم کار کند.

    - راه دیگر (اگر نمی‌خواهید thumbnail درست کنید) این است که از ابتدا اندازه تصویری را که قرار است نمایش داده شود مشخص کنید (طول و عرض کوچک). البته اگر تصویر شما همانطور که در این مقاله ذکر شد از نوع قرار گرفته شده داخل متن نیست و کاملا کنترل شده مثلا توسط یک دیتالیست رندر می‌شود، به این صورت اندازه ابتدایی کوچک خواهد بود و پس از لود شدن پاپ باکس، با کلیک کاربر روی عکس، اندازه اصلی را خواهید دید. (اسکریپتی که برای پاپ باکس نوشتم اینکار را به صورت خودکار انجام می‌دهد ولی خوب اسکریپت باید لود شده باشد که به طور قطع قبل از لود شدن تصویر اینکار تمام شده)

    - اگر تصویر شما مخلوط داخل متن است و کنترلی روی آن ندارید باید با regular expressions آنها را پیدا کنید و سپس خواص مورد نظر خودتان را به تگ‌های تصویر اضافه کنید. (روش سمت سرور قبل از نمایش تصاویر)
  • #
    ‫۹ سال و ۲ ماه قبل، پنجشنبه ۱ مرداد ۱۳۹۴، ساعت ۰۳:۰۸
    البته بهتر هست اینگونه موارد به پلاگین‌های سمت کلاینت سپرده نشود و تغییر اندازه تصویر به یک هندلر یا اکشن ریزالت سپرده شود تا در حجم دریافتی توسط کاربر صرفه جویی شود.روش ذخیره چند تصویر با اندازه‌های مختلف در حین افزودن به سیستم هم خوب است ولی خب فضای ذخیره سازی بیشتری را میطلبد و هم تعدد فایل‌ها و مسیرها را زیاد میکند که روش اول این مشکل را ندارد.این روش برای نهایت دو عکس مناسب است.البته روش اول هم با افزایش تعدد درخواست منابع زیادتری از سرور را باید حین تبدیل اندازه مصرف کند.