پردازش تصویر بومی لاراول در ۱۳.۲۰
خلاصهٔ کاملتر
به نوشتهٔ Paul Redmond توی Laravel News، لاراول ۱۳.۲۰ با کامپوننت Illuminate\Image پردازش تصویر رو بهصورت first-party اضافه کرده. درایورهای GD و Imagick پشت صحنه روی Intervention Image v4 سوارن که یه وابستگی پیشنهادیه نه اجباری، پس باید خودت نصبش کنی؛ اگه بدون نصبش درایور رو صدا بزنی، لاراول یه ImageException میده و دقیق میگه چی کم داری. پیشفرض GD ـه و با images.default یا متدهایی مثل usingImagick() میتونی درایور رو عوض کنی.
ورودی از هر جایی میتونه بیاد: متد تازهٔ Request::image() برای آپلودها (اگه فیلد نباشه null برمیگردونه، پس اول ولیدیت کن)، و Facade Image با fromPath، fromUrl، fromStorage، fromBytes و fromBase64 برای بقیهٔ منابع. نکتهٔ اصلی معماری اینه که هر تبدیل یه نمونهٔ جدید برمیگردونه و هیچی پردازش نمیشه تا وقتی خروجی بخوای (store()، toBytes()، width()). نتیجهٔ عملیش اینه که میتونی از یه تصویر پایه چند نسخهٔ مختلف بسازی بدون اینکه تبدیلهای یکی روی اون یکی اثر بذاره.
برای اندازه پنج متد داری و انتخاب درستش مهمه: cover() دقیقاً به ابعاد خواستهشده میرسه و برش میزنه (مناسب آواتار و بندانگشتی)، contain() کل تصویر رو داخل ابعاد جا میده و با رنگ پسزمینه پُر میکنه، scale() نسبت رو حفظ میکنه و هیچوقت بزرگنمایی نمیکنه، resize() ابعاد رو بهزور اعمال میکنه و ممکنه تصویر رو کش بده، و crop() یه ناحیه رو از مختصات مشخص میبُره. کنارش هم rotate، blur، sharpen، grayscale، flip و flop هست و متد orient() که با EXIF عکسهای موبایل رو خودکار میچرخونه.
تبدیل فرمت با toWebp()، toJpg()، toPng()، toAvif() و بقیه انجام میشه و quality() روی فرمتهای lossy مثل WebP و JPEG و AVIF اثر داره. متد optimize() هم یه میانبره که پیشفرض به WebP با کیفیت ۷۰ تبدیل میکنه. کل جریان یه آپلود آواتار اینجوری در میاد:
$path = $request->image('avatar')
->orient()
->cover(512, 512)
->optimize()
->storePublicly('avatars', disk: 's3');متدهای ذخیره (store، storeAs، storePublicly) دقیقاً مثل UploadedFile کار میکنن و اسم هششده هم پسوند درست خروجی رو میگیره؛ یعنی یه JPEG که toWebp() خورده با پسوند webp ذخیره میشه. اگه بهجای فایل خودِ داده رو بخوای، toBytes()، toBase64() و toDataUri() هست. نویسنده اضافه میکنه چون کلاس Image از تِرِیت Conditionable استفاده میکنه، when() و unless() هم مثل بقیهٔ جاهای لاراول در دسترسن، و با Image::extend() و Image::transformUsing() میشه درایور سفارشی ثبت کرد یا رفتار یه تبدیل خاص رو بازنویسی کرد.
نکات کلیدی:
- لاراول ۱۳.۲۰ کامپوننت Illuminate\Image رو معرفی کرده؛ درایورهای GD و Imagick روی Intervention Image v4
- API غیرقابلتغییره و تنبل: هر تبدیل نمونهٔ جدید میده و پردازش تا لحظهٔ خروجی عقب میافته
- پنج متد اندازه: cover، contain، scale (بدون بزرگنمایی)، resize و crop
- optimize() میانبر تبدیل به WebP با کیفیت ۷۰ ـه و فرمت و کیفیت دلخواه هم قبول میکنه
- Request::image()، Facade Image و Storage::image() نقطهٔ ورود گرفتن تصویرن
- when()/unless() برای تبدیل شرطی، و extend()/transformUsing() برای توسعه




