این مورد بسیار مهم است که هنگام نمایش عکس ها در وبسایت خودمان, اطمینان پیدا کنیم که در صفحه بندی سایت کاملا هم اندازه باشد . اگر اینطور نیست , پس بنابراین باید اندازه تصویر را تغییر دهیم .
تغییر اندازه تصویر در php با استفاده از توابعی برای ساخت عکس جدید با اندازه های مشخص شده بسیار آسان است . در مقاله قبل کدی برای تغییر سایز همه عکس ها بصورت یکجا (multiple) را قرار دادیم.
بنابراین , استفاده از چندین تابع برای تغییر اندازه تصویر در php نیاز است .مراحل تغییر سایز عکس در php بصورت زیر است :
- دریافت id عکس منبع
- دریافت id لایه عکس نهایی
- تغییر سایز عکس
- ذخیره عکس جدید
دریافت id عکس منبع
برای کار کردن با عکسی که قرار است آن را تغییر اندازه بدیم , نیاز داریم که id برای شناسایی فایل منبع را دریافت کنیم . همانطور که در آموزش کار با فایل ها در php انجام دادیم و یا دریافت متغییر handler که هنگام کار با دایرکتری ها در php انجام دادیم .
در php , توابع متنوعی برای دریافت id منبع فایل تصویر وجود دارد . این توابع php معمولا بر اساس نوع تصویر داده شده استفاده می شوند . برای مثال imagecreatefromjpeg(),imagecreatefromgif(),imagecreatefrompng()
, برای مشخص کردن id تصاویر با فرمت JPEG,GIF,PNG استفاده میشوند.
در این مرحله , نیاز داریم تا نوع تصویر را با تابع php به نام getimagesize()
دریافت کنیم که این تابع اطلاعات بیشتری از مشخصات تصویر مانند طول (height) و عرض (width) و غیره .. را برای ما مشخص می کند .
بعد از آن می توانیم بنابر خروجی مورد نظر از توابع بالا برای دریافت id منبع استفاده کنیم. همه این توابع php کار با تصاویر , برای دریافت مشخصات عکس استفاده می شود . برای مثال :
1 2 3 4 5 6 7 8 9 10 |
$file = "christmas.jpg"; $source_properties = getimagesize($file); $image_type = $source_properties[2]; if( $image_type == IMAGETYPE_JPEG ) { $image_resource_id = imagecreatefromjpeg($file); } elseif( $image_type == IMAGETYPE_GIF ) { $image_resource_id = imagecreatefromgif($file); } elseif( $image_type == IMAGETYPE_PNG ) { $image_resource_id = imagecreatefrompng($file); } |
ثابت (constant) استفاده شده در شرط های بالا . یک مقدار از پیش تعریف شده برای نوع عکس ها است . برای مثال , IMAGETYPE_JPEG
با دو مقدار تعریف شده که برا مشخص کردن نوع JPEG استفاده می شود .
برای کپی صحیح و کامل کدها ، دابل کلیک کرده تا وارد محیط سفید و کپی شوید در غیر اینصورت امکان دارد اجرای کدها با مشکل روبرو شود
دریافت id لایه عکس نهایی
بعد از دریافت id منبع از فایل عکس , نیاز داریم که یک تصویر با لایه فایل اصلی بسازیم . این تصویر ساخته شده با اندازه های عکس اصلی که ان را تغییر اندازه (resize) می دهیم ,می باشد
تابع از پیش ساخته php به نام imagecreatetruecolor()
برای این هدف استفاده می شود که به عنوان ورودی طول و عرض تصویر را دریافت می کند.
1 2 3 |
$target_width =200; $target_height =200; $target_layer=imagecreatetruecolor($target_width,$target_height); |
تابع imagecreatetruecolor() یک تصویر خالی را ایجاد می کند که به عنوان خروجی id تصویر جدید ساخته شده را با طول و عرض تعریف شده برگشت می دهد . این id در مراحل بعد استفاده می شود .
تغییر سایز عکس
برای این مرحله از تغییر اندازه تصویر در php ما باید اطلاعات تصویر را استفاده کنیم که عبارت اند از :
- Id لایه منبع و فایل نهایی
- طول و عرض عکس اصلی و عکس ساخته شده
با استفاده از اطلاعات دریافتی , قسمت های مورد نیاز تصویر به لایه فایل نهایی کپی خواهد شد .برای این کار از تابع php به نام imagecopuresapled() استفاده می کنیم.
1 |
imagecopyresampled($target_layer,$image_resource_id,0,0,0,0,$target_width,$target_height, $source_properties[0],$source_properties[1]); |
در کد نمونه بالا , به بعضی از آرگومان های این تابع مقدار ۰ را پاس دادیم . این آرگومتن ها در واقع مقدار مختصات x,y به صورت تکرار شونده در تصویر منبع و نهایی است .
این آرگومان ها دارای مقادیر برای برش (crop) قسمت هایی از عکس منبع است . همچنین فکر نمیکنیم نیاز باشد که اشاره به این کنیم که مقادیر x,y به معنای این است که کل عکس طبق طول و عرض های اشاره شده باید برش داده شود .
نکته : یک تابع مشابه تابع imagecopuresapled() به نام imagecopyresized() وجود دارد که البته تابع imagecopuresapled() تصاویر با کیفیت و فشرده تری را ایجاد می کند.
ذخیره عکس جدید
در این مرحله از تغییر اندازه تصویر در php , زمان آن است که تصویر جدید را در مکان دلخواه ذخیره کنیم .برای همین به اطلاعات زیر نیاز داریم.
- Id لایه عکس جدید
- نام فایل نهایی یا آدرس ذخیره
حالا می توانیم از کد نمونه زیر برای نمایش تصویر جدید استفاده کنیم.
1 |
imagejpeg($target_layer,"christmas_thump.jpg"); |
در تمام مراحل فقط از فایل تصویر JPEG استفاده کردیم که میتوانید برای فرمت های دیگر از توابع مشابه که در بالا معرفی شده بهره ببرید.
مثال تغییر اندازه تصویر در php
مثال زیر به شما نحوه تغییر سایز هر نوع عکسی را که از طریق یک فرم html آپلود می شود را می دهد . بنابر این به راحتی از اسکریپت php زیر می توانید برای تغییر سایر تصاویر آپلود شده استفاده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php if(isset($_POST["submit"])) { if(is_array($_FILES)) { $file = $_FILES['myImage']['tmp_name']; $source_properties = getimagesize($file); $image_type = $source_properties[2]; if( $image_type == IMAGETYPE_JPEG ) { $image_resource_id = imagecreatefromjpeg($file); $target_layer = fn_resize($image_resource_id,$source_properties[0],$source_properties[1]); imagejpeg($target_layer,$_FILES['myImage']['name'] . "_thump.jpg"); } elseif( $image_type == IMAGETYPE_GIF ) { $image_resource_id = imagecreatefromgif($file); $target_layer = fn_resize($image_resource_id,$source_properties[0],$source_properties[1]); imagegif($target_layer,$_FILES['myImage']['name'] . "_thump.gif"); } elseif( $image_type == IMAGETYPE_PNG ) { $image_resource_id = imagecreatefrompng($file); $target_layer = fn_resize($image_resource_id,$source_properties[0],$source_properties[1]); imagepng($target_layer,$_FILES['myImage']['name'] . "_thump.png"); } } } function fn_resize($image_resource_id,$width,$height) { $target_width =200; $target_height =200; $target_layer=imagecreatetruecolor($target_width,$target_height); imagecopyresampled($target_layer,$image_resource_id,0,0,0,0,$target_width,$target_height, $width,$height); return $target_layer; } ?> |
و کد html برای بارگذاری تصویر بصورت زیر است .
1 2 3 4 |
<form name="frmImageResize" action="" method="post" enctype="multipart/form-data"> <input type="file" name="myImage" /> <input type="submit" name="submit" value="Submit" /> </form> |
از توابع بالا که معرفی کردیم برای ساخت کپچا نیز استفاده کردیم . درواقع کتابخانه قدرمتند GD به ما امکانات زیادی را برای کار با تصاویر در php ارایه می دهد . امیدوارم از این آموزش کاربردی برای تغییر اندازه تصویر در php نهایت استفاده را ببرید . تغییر سایز تصاویر در تمام وبسایت ها بخصوص در قسمت های نمایش عکس در پست ها , تصویر پروفایل بسیار مفید می باشد . امیدوارم در پروژه هایی که می نویسید از این کد کاربردی نهایت استفاده را ببرید.
امیدوارم از آموزش تغییر اندازه تصویر در php نهایت استفاده را برده باشید .
هر مشکلی در پیاده سازی کد ها داشتید . از قسمت نظرات با ما در ارتباط باشید , سریعا پاسخگوی سوالات شما هستیم .
برای دانلود سورس کد کامل این آموزش از باکس دانلود استفاده کنید.
موفق و پیروز باشید
سلام مهندس شفیعی من با استفاده از exif read data اندازه فایل آپلود شده رو هاست رو گرفتم ولی فایل png رو پشتیبانی نمیکنه
تابع getimagesize هم اندازه تصویر رو نمیده
میشه راهنمایی کنید اندازه فایلی که رو هاست هست رو چطوری بگیرم با تشکر
سلام من اندازه عکس رو به صورت درصدی کم کردم ولی باعث پایین اومدی کیفیت تصویر شد!
چرا کم کردن اندازه اونم به صورت درصدی باعث پایین اومدن کیفیت عکس میشه
الان تلگرام اندازه تصاویر رو کاهش میده موقع آپلود ولی کیفیت کاهش پیدا نمیکنه!
راه کاری دارید کیفیت پایین نیاد؟
یه مشکل دیگه که الان بهش توجه کردم اینه که خروجی عکس رو با چرخش ۹۰ درجه تحویل میده و این باعث بهم خوردت طول و عرض و در نهایت کیفیت تصویر میشه!
ممنون میشم بررسی کنید ببیند مشکل کجاس خیلی مهم هست واسم
سلام. تست شد چنین مشکلی وجود نداره ابتدا سعی کنید کد رو جدا از پروژه خودتون تست کنید و بعد وارد کدهای قبلی خود کنید تا مشکلی پیش نیاد
درمورد بعضی از عکسا این اتفاق میوفته
مثلا عکس زیر:
https://s16.picofile.com/file/8417492476/IMG_%DB%B2%DB%B0%DB%B2%DB%B0%DB%B0%DB%B8%DB%B0%DB%B2_%DB%B2%DB%B1%DB%B0%DB%B6%DB%B1%DB%B5.jpg
سلام ممنون بابت این آموزش مفید.
جناب شفیعی من میخواستم ابعاد عکس(طول و عرض) رو در زمان آپلود به ۸۰۰ پیکسل در ۸۰۰پیکسل تغییر بدم. هرچی تلاش کردم نشد. تکه کد رو اینجا ارسال کردم خدمتتون ممنون میشم راهنمایی بفرمایید شرط رو چطور اضافه کنم که مثلا اگر ابعاد برابر با ۸۰۰ نبود اون رو برابر ۸۰۰ کنه. تئوریش رو بلد هستم ولی گویا یک جایی رو اشتباه مینویسم.
با تشکر
سلام. خوشحالیم که مفید واقع شده.
بعد از move_uploaded_file باید عملیات موردنظر رو انجام بدید.
همچنین برای اینکار باید php متوسط بلد باشید.
سلام و خسته نباشید و ممنون از مطالب مفیدتون
من تو پروژه ای که دارم انجام میدم نیاز دارم که همه ی پیکسل های یک عکس رو بگردم و مختصات عکسی قسمت هایی که دارای رنگ های خاصی(رنگ های زرد وقرمز و نارنجی) هستن رو برداشت کنم.ممنون میشم راهنماییم کنین که از چه توابعی واسه این دوکار(یعنی پیکسل پیکسل جست و جو کردن عکس و برداشت مختصات عکسی از طریق تشخیص رنگ روی عکس در php) باید استفاده کنم یا اگه لینکی هست که من رو کمک کنه برام بزارین.چون من کل مطالب سایتتون رو گشتم ولی هنوز مشکلم حل نشده و در آخر گفتم که سوالم رو مطرح کنم.خیلی ممنونم ازتون.
کسی نمی تونه در رابطه با سوالم راهنماییم کنه؟؟
سلام ممنون. خوشحالیم که مفید واقع شده.
این مورد رو شخصا تست نکردم ولی میتونید در بین کتابخانه های پردازش تصویر که در گیت هاب موجود است دنبال راه حل یا سورس مربوطه بگردید.
توجه داشته باشید که php آنقدری که فکر می کنید در زمینه پردازش تصویر قوی نیست و پایتون برای این کار گزینه خوبیه یا ابزارهایی تحت لینوکس موجود هستند که نیاز است اول آنها رو روی سرور نصب کنید و بعد با php از قابلیت های آن استفاده کنید.
موفق باشید.
خیلی ممنونم ازتون
سلام.
اگه عکس بکگراند نداشته باشه چیکار کنم(transparent)؟ وقتی تغییر سایز میده پیشفرض رنگ مشکی برای پس زمینه انتخاب میشه، فکر کنم بخاطر imagecopyresampled این باشه…
درمورد تصاویر gif هم حالت انیمیشنی خودش رو از دست میده.
سلام . ابتدا نیاز است که حالت blending را off کنید و همچنین قبل استفاده تابع
imagecolorallocatealpha()
, مقدار چنل آلفا را true قرار بدید . کد :در مورد تغییر اندازه تصاویر gif بدون خراب شدن فریم های انیمیشن میتونید چندین کار انجام بدید.
اگر ImageMagick داشته باشید که به راحتی اینکار قابل انجام است. کاری که با
imageMagick
انجام میدیم, ریسایز کردن تک تک فریم های انمییشن بصورت جداگانه است.اگر هم دسترسی شل به سرور رو دارید میتونید دستورات مربوطه بش رو از طریق php با توابعی مثل
shell_exec
,passthru
و .. انجام بدید مثلا اینجا ازsystem
برای اجرای دستورات سیستمی از طریق اسکریپت PHP استفاده کردیمهمچنین بجای روش بالا میتونید از کتابخانه ای
imagecraft
در گیت هاب بهره ببرید. https://github.com/coldume/imagecraftکار بعدی ای که میتونید انجام بدید استفاده از php خالص است که نیاز به کدنویسی بیشتری هستش چرا که مراحلی مثل تشخیص نوع فایل انیمیشنی با gd , جدا کردن تک تک فریم ها , ریسایز تک به تک آنها و درنهایت چسباندن به یک دیگر است که بحث رو پیچیده تر میکنه و میتونید از کتابخانه های بالا بهره ببرید.
موفق باشید
سلام خسته نباشید ببخشید من از این کد استفاده کردم اما بعضی از تصاویری که اپلود میکنم دچار ی چرخش ۹۰ درجه ای میشن نمیدونم مشکل از چیه اگه میشه راهنماییم کنید
سلام . ممنون.
همچین موردی هنگام تست مجدد مشاهده نشد . اسکریپت کلی خودتون رو قرار بدید تا چک بشه.
موفق باشید.
کدها و دیتابیس رو داخل ی پوشه قرار دادم اپلود کردم از اینجا میتونید تست کنید
ممنون
تست شد و نتیجه رو در اسکرین شات زیر میتونید ببینید. هیچ چرخشی انجام نشده .
http://s9.picofile.com/file/8327201600/resize.jpg
از این آموزش که بصورت ajaxی است هم برای بهتر کردن عملیات میتونید استفاده کنید : https://netparadis.com/jquery-ajax-image-resize-php
موفق باشید.