العمل مع الصور في PHP: تغيير الحجم (resize) والقص (crop) والتحسين
\n\nتعد معالجة الصور إحدى المهام الأساسية عند تطوير تطبيقات الويب. سواء كانت صور المستخدمين الشخصية، أو معاينات الأخبار، أو معارض المنتجات، فستحتاج دائمًا تقريبًا إلى تغيير الحجم (resize) والقص (crop) للصور. في PHP، هناك مكتبتان رئيسيتان لهذا الغرض: GD (مضمنة) وImagick (إضافة تعتمد على ImageMagick).
\n\nفي هذه المقالة، سنستعرض كلا النهجين، ونعرض أمثلة عملية للكود، ونقدم توصيات حول المكتبة التي يجب اختيارها لمشروعك.
\n\n1. مكتبة GD (GDLib)
\n\nGD هي إضافة PHP قياسية، متوفرة تقريبًا على أي استضافة. وهي تدعم التنسيقات الأساسية: JPEG، PNG، GIF، WEBP (منذ PHP 7.1+). العيب هو جودة إعادة العينات (resampling) الأقل مقارنة بـ Imagick، ولكنها كافية لمعظم المهام.
\n\n1.1. تغيير الحجم (resize) باستخدام GD
\n\nالدالة imagecopyresampled() تنشئ صورة جديدة مع الاستيفاء (التنعيم). مثال على تغيير الحجم إلى عرض 300 بكسل مع الحفاظ على النسب:
<?php\nfunction resizeImageGD($srcFile, $destFile, $newWidth = 300) {\n // الحصول على أبعاد الصورة الأصلية\n list($width, $height, $type) = getimagesize($srcFile);\n \n // إنشاء مورد الصورة الأصلية حسب النوع\n switch ($type) {\n case IMAGETYPE_JPEG:\n $src = imagecreatefromjpeg($srcFile);\n break;\n case IMAGETYPE_PNG:\n $src = imagecreatefrompng($srcFile);\n break;\n case IMAGETYPE_GIF:\n $src = imagecreatefromgif($srcFile);\n break;\n default:\n return false;\n }\n \n // حساب الارتفاع الجديد بشكل متناسب\n $ratio = $width / $height;\n $newHeight = intval($newWidth / $ratio);\n \n // إنشاء صورة فارغة بالحجم المطلوب\n $dst = imagecreatetruecolor($newWidth, $newHeight);\n \n // تفعيل قناة ألفا لـ PNG/GIF\n imagealphablending($dst, false);\n imagesavealpha($dst, true);\n \n // إعادة العينات (نسخ مع إعادة حساب البكسل)\n imagecopyresampled($dst, $src, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);\n \n // حفظ النتيجة\n imagejpeg($dst, $destFile, 85); // جودة 85%\n \n // تحرير الذاكرة\n imagedestroy($src);\n imagedestroy($dst);\n \n return true;\n}\n\n// الاستخدام:\nresizeImageGD('photo.jpg', 'photo_thumb.jpg', 300);\n?>\n\n1.2. القص (crop) باستخدام GD
\n\nللقص، نستخدم الدالة imagecopy() أو imagecopyresampled() مع تحديد المنطقة. مثال: قص مربع مركزي بحجم 200x200:
<?php\nfunction cropCenterGD($srcFile, $destFile, $cropSize = 200) {\n list($width, $height, $type) = getimagesize($srcFile);\n \n // تحديد النوع\n $src = imagecreatefromjpeg($srcFile); // مثال لـ JPEG\n \n // حساب إحداثيات المربع المركزي\n $x = ($width - $cropSize) / 2;\n $y = ($height - $cropSize) / 2;\n \n // إذا كانت الصورة الأصلية أصغر من حجم القص - لا نقص\n if ($width < $cropSize || $height < $cropSize) {\n $cropSize = min($width, $height);\n $x = 0;\n $y = 0;\n }\n \n $dst = imagecreatetruecolor($cropSize, $cropSize);\n imagecopy($dst, $src, 0, 0, $x, $y, $cropSize, $cropSize);\n \n imagejpeg($dst, $destFile, 90);\n imagedestroy($src);\n imagedestroy($dst);\n}\n\ncropCenterGD('photo.jpg', 'cropped.jpg', 200);\n?>\n\n2. مكتبة Imagick
\n\nImagick هي إضافة قوية توفر واجهة موجهة للكائنات (OOP) لـ ImageMagick. تدعم أكثر من 200 تنسيق، وجودة ممتازة لإعادة العينات، والعمل مع الألوان، والمرشحات، والرسوم المتحركة. تتطلب التثبيت على الخادم (غير متوفرة دائمًا على الاستضافة الرخيصة).