تغییر اندازه تصویر در php

  • آپدیت شده در تاریخ

تغییر اندازه تصویر در php

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

تغییر اندازه تصویر در php با استفاده از توابعی برای ساخت عکس جدید با اندازه های مشخص شده بسیار آسان است . در مقاله قبل کدی برای تغییر سایز همه عکس ها بصورت یکجا (multiple) را قرار دادیم.

بنابراین , استفاده از چندین تابع برای تغییر اندازه تصویر در php نیاز است .مراحل تغییر سایز عکس در php بصورت زیر است :

  • دریافت id عکس منبع
  • دریافت id لایه عکس نهایی
  • تغییر سایز عکس
  • ذخیره عکس جدید

تغییر اندازه تصویر در php

دریافت id عکس منبع

برای کار کردن با عکسی که قرار است آن را تغییر اندازه بدیم , نیاز داریم که id برای شناسایی فایل منبع را دریافت کنیم . همانطور که در آموزش کار با فایل ها در php انجام دادیم و یا دریافت متغییر handler که هنگام کار با دایرکتری ها در php انجام دادیم .

در php , توابع متنوعی برای دریافت id منبع فایل تصویر وجود دارد . این توابع php معمولا بر اساس نوع تصویر داده شده استفاده می شوند . برای مثال imagecreatefromjpeg(),imagecreatefromgif(),imagecreatefrompng(), برای مشخص کردن id تصاویر با فرمت JPEG,GIF,PNG استفاده میشوند.

در این مرحله , نیاز داریم تا نوع تصویر را با تابع php به نام getimagesize() دریافت کنیم که این تابع اطلاعات بیشتری از مشخصات تصویر مانند طول (height) و عرض (width) و غیره .. را برای ما مشخص می کند .

بعد از آن می توانیم بنابر خروجی مورد نظر از توابع بالا برای دریافت id منبع استفاده کنیم. همه این توابع php کار با تصاویر , برای دریافت مشخصات عکس استفاده می شود . برای مثال :

ثابت (constant) استفاده شده در شرط های بالا . یک مقدار از پیش تعریف شده برای نوع عکس ها است . برای مثال , IMAGETYPE_JPEG با دو مقدار تعریف شده که برا مشخص کردن نوع JPEG استفاده می شود .

برای کپی صحیح و کامل کدها ، دابل کلیک کرده تا وارد محیط سفید و کپی شوید در غیر اینصورت امکان دارد اجرای کدها با مشکل روبرو شود

دریافت id لایه عکس نهایی

بعد از دریافت id منبع از فایل عکس , نیاز داریم که یک تصویر با لایه فایل اصلی بسازیم . این تصویر ساخته شده با اندازه های عکس اصلی که ان را تغییر اندازه (resize) می دهیم ,می باشد

تابع از پیش ساخته php به نام imagecreatetruecolor() برای این هدف استفاده می شود که به عنوان ورودی طول و عرض تصویر را دریافت می کند.

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

تغییر سایز عکس

برای این مرحله از تغییر اندازه تصویر در php ما باید اطلاعات تصویر را استفاده کنیم که عبارت اند از :

  • Id لایه منبع و فایل نهایی
  • طول و عرض عکس اصلی و عکس ساخته شده

با استفاده از اطلاعات دریافتی , قسمت های مورد نیاز تصویر به لایه فایل نهایی کپی خواهد شد .برای این کار از تابع php به نام imagecopuresapled() استفاده می کنیم.

در کد نمونه بالا , به بعضی از آرگومان های این تابع مقدار ۰ را پاس دادیم . این آرگومتن ها در واقع مقدار مختصات x,y به صورت تکرار شونده در تصویر منبع و نهایی است .

این آرگومان ها دارای مقادیر برای برش (crop) قسمت هایی از عکس منبع است . همچنین فکر نمیکنیم نیاز باشد که اشاره به این کنیم که مقادیر x,y به معنای این است که کل عکس طبق طول و عرض های اشاره شده باید برش داده شود .

نکته : یک تابع مشابه تابع imagecopuresapled() به نام imagecopyresized() وجود دارد که البته تابع imagecopuresapled() تصاویر با کیفیت و فشرده تری را ایجاد می کند.

ذخیره عکس جدید

در این مرحله از تغییر اندازه تصویر در php , زمان آن است که تصویر جدید را در مکان دلخواه ذخیره کنیم .برای همین به اطلاعات زیر نیاز داریم.

  • Id لایه عکس جدید
  • نام فایل نهایی یا آدرس ذخیره

حالا می توانیم از کد نمونه زیر برای نمایش تصویر جدید استفاده کنیم.

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

مثال تغییر اندازه تصویر در php

مثال زیر به شما نحوه تغییر سایز هر نوع عکسی را که از طریق یک فرم html آپلود می شود را می دهد . بنابر این به راحتی از اسکریپت php زیر می توانید برای تغییر سایر تصاویر آپلود شده استفاده کنید.

و کد html برای بارگذاری تصویر بصورت زیر است .

از توابع بالا که معرفی کردیم برای ساخت کپچا نیز استفاده کردیم . درواقع کتابخانه قدرمتند GD به ما امکانات زیادی را برای کار با تصاویر در php ارایه می دهد . امیدوارم از این آموزش کاربردی برای تغییر اندازه تصویر در php نهایت استفاده را ببرید . تغییر سایز تصاویر در تمام وبسایت ها بخصوص در قسمت های نمایش عکس در پست ها , تصویر پروفایل بسیار مفید می باشد . امیدوارم در پروژه هایی که می نویسید از این کد کاربردی نهایت استفاده را ببرید.

امیدوارم از آموزش تغییر اندازه تصویر در php نهایت استفاده را برده باشید .

هر مشکلی در پیاده سازی کد ها داشتید . از قسمت نظرات با ما در ارتباط باشید , سریعا پاسخگوی سوالات شما هستیم .

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

موفق و پیروز باشید

حسن شفیعی توسعه دهنده وب و موبایل مدیر سایت علاقه خاصی به برنامه نویسی وب و موبایل دارم و هر روز تلاش می کنم به این حوزه مسلط تر شوم و اطلاعاتم را به شکل کاربردی برای علاقه مندان در وب به اشتراک بگذارم. اگر نیاز به برنامه نویس برای انجام پروژه و نوشتن اسکریپت های سمت وب, اپلیکیشن های اندروید و ios, پیدا کردن راه حل توسعه و غیره داشتید حتما از طریق تماس با ما/ واتساپ/ تلگرام بهم پیام بدید. برایتهیه هاست مطمین و پرسرعت کلیک کنید
مطالب زیر را حتما بخوانید
دیدگاه کاربران (۱۷)

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

  1. محمود رنجبر ۶ شهریور ۱۴۰۰

    سلام مهندس شفیعی من با استفاده از exif read data اندازه فایل آپلود شده رو هاست رو گرفتم ولی فایل png رو پشتیبانی نمیکنه
    تابع getimagesize هم اندازه تصویر رو نمیده
    میشه راهنمایی کنید اندازه فایلی که رو هاست هست رو چطوری بگیرم با تشکر

    پاسخ
  2. hassan ۲۳ آذر ۱۳۹۹

    سلام من اندازه عکس رو به صورت درصدی کم کردم ولی باعث پایین اومدی کیفیت تصویر شد!
    چرا کم کردن اندازه اونم به صورت درصدی باعث پایین اومدن کیفیت عکس میشه
    الان تلگرام اندازه تصاویر رو کاهش میده موقع آپلود ولی کیفیت کاهش پیدا نمیکنه!
    راه کاری دارید کیفیت پایین نیاد؟

    پاسخ
    1. hassan ۲۴ آذر ۱۳۹۹

      یه مشکل دیگه که الان بهش توجه کردم اینه که خروجی عکس رو با چرخش ۹۰ درجه تحویل میده و این باعث بهم خوردت طول و عرض و در نهایت کیفیت تصویر میشه!
      ممنون میشم بررسی کنید ببیند مشکل کجاس خیلی مهم هست واسم

      پاسخ
      1. حسن شفیعی ۲۴ آذر ۱۳۹۹

        سلام. تست شد چنین مشکلی وجود نداره ابتدا سعی کنید کد رو جدا از پروژه خودتون تست کنید و بعد وارد کدهای قبلی خود کنید تا مشکلی پیش نیاد

        پاسخ
      2. hassan ۲۴ آذر ۱۳۹۹
  3. پوریا ۱ آذر ۱۳۹۹

    سلام ممنون بابت این آموزش مفید.
    جناب شفیعی من میخواستم ابعاد عکس(طول و عرض) رو در زمان آپلود به ۸۰۰ پیکسل در ۸۰۰پیکسل تغییر بدم. هرچی تلاش کردم نشد. تکه کد رو اینجا ارسال کردم خدمتتون ممنون میشم راهنمایی بفرمایید شرط رو چطور اضافه کنم که مثلا اگر ابعاد برابر با ۸۰۰ نبود اون رو برابر ۸۰۰ کنه. تئوریش رو بلد هستم ولی گویا یک جایی رو اشتباه مینویسم.
    با تشکر

    پاسخ
    1. حسن شفیعی ۱ آذر ۱۳۹۹

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

      پاسخ
  4. زینب ۱۸ آذر ۱۳۹۸

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

    پاسخ
    1. زینب ۱۹ آذر ۱۳۹۸

      کسی نمی تونه در رابطه با سوالم راهنماییم کنه؟؟

      پاسخ
      1. حسن شفیعی ۲۱ آذر ۱۳۹۸

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

        پاسخ
      2. زینب ۲۱ آذر ۱۳۹۸

        خیلی ممنونم ازتون

        پاسخ
  5. milad ۲۶ آبان ۱۳۹۷

    سلام.
    اگه عکس بکگراند نداشته باشه چیکار کنم(transparent)؟ وقتی تغییر سایز میده پیشفرض رنگ مشکی برای پس زمینه انتخاب میشه، فکر کنم بخاطر imagecopyresampled این باشه…
    درمورد تصاویر gif هم حالت انیمیشنی خودش رو از دست میده.

    پاسخ
    1. حسن شفیعی ۲۶ آبان ۱۳۹۷

      سلام . ابتدا نیاز است که حالت blending را off کنید و همچنین قبل استفاده تابع imagecolorallocatealpha() , مقدار چنل آلفا را true قرار بدید . کد :

      در مورد تغییر اندازه تصاویر gif بدون خراب شدن فریم های انیمیشن میتونید چندین کار انجام بدید.

      اگر ImageMagick داشته باشید که به راحتی اینکار قابل انجام است. کاری که با imageMagick انجام میدیم, ریسایز کردن تک تک فریم های انمییشن بصورت جداگانه است.

      اگر هم دسترسی شل به سرور رو دارید میتونید دستورات مربوطه بش رو از طریق php با توابعی مثل shell_exec,passthru و .. انجام بدید مثلا اینجا از system برای اجرای دستورات سیستمی از طریق اسکریپت PHP استفاده کردیم

      همچنین بجای روش بالا میتونید از کتابخانه ای imagecraft در گیت هاب بهره ببرید. https://github.com/coldume/imagecraft

      کار بعدی ای که میتونید انجام بدید استفاده از php خالص است که نیاز به کدنویسی بیشتری هستش چرا که مراحلی مثل تشخیص نوع فایل انیمیشنی با gd , جدا کردن تک تک فریم ها , ریسایز تک به تک آنها و درنهایت چسباندن به یک دیگر است که بحث رو پیچیده تر میکنه و میتونید از کتابخانه های بالا بهره ببرید.

      موفق باشید

      پاسخ
  6. ستاره ۲ خرداد ۱۳۹۷

    سلام خسته نباشید ببخشید من از این کد استفاده کردم اما بعضی از تصاویری که اپلود میکنم دچار ی چرخش ۹۰ درجه ای میشن نمیدونم مشکل از چیه اگه میشه راهنماییم کنید

    پاسخ
    1. حسن شفیعی ۲ خرداد ۱۳۹۷

      سلام . ممنون.

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

      موفق باشید.

      پاسخ
      1. ستاره ۲ خرداد ۱۳۹۷

        کدها و دیتابیس رو داخل ی پوشه قرار دادم اپلود کردم از اینجا میتونید تست کنید
        ممنون

        پاسخ
      2. حسن شفیعی ۲ خرداد ۱۳۹۷

        تست شد و نتیجه رو در اسکرین شات زیر میتونید ببینید. هیچ چرخشی انجام نشده .
        http://s9.picofile.com/file/8327201600/resize.jpg

        از این آموزش که بصورت ajaxی است هم برای بهتر کردن عملیات میتونید استفاده کنید : https://netparadis.com/jquery-ajax-image-resize-php

        موفق باشید.

        پاسخ
دوره های آموزشی