السلام عليكم ورحمة الله وبركاته
اليوم بإذن الله سنقوم بإنشاء فئة لإعادة تحجيم الصور وقد تحدث زميلنا عبداللطيف بتفصيل عن التعامل مع مكتبة الـ GD في هذا الموضوع .
من تابع معنا الفئات الأخرى التي قمنا بإنشأها من قبل - ضمن تطبيقات على برمجة الكائنات في هذا الموضوع - لن يكون الأمر غريب عليه , ومن يريد أن يفهم الفئة بشكل جيد فليتابع من البداية لأني لن أعيد شرح الجذئيات التي تم شرحها من قبل .
* متغيرات الفئة :
private static $classObj = NULL; private $img = array(); private $newImg = array(); private $error;
1- $classObj متغير لحفظ الكائن المنشأ من الفئة .
2- $img وهو مصفوفة لحفظ بيانات الصورة المراد إعادة تحجيمها .
3- $newImg مصفوفة لحفظ بيانات الصورة الجديدة بعد التحجيم .
4- $error متغير لحفظ نص الخطأ إذا حدث أقناء عمل الفئة .
ومن أحد إستخدامات البرمجة الكائنية هي تجذئة المهام على عدة دوال داخل الفئة كل دالة تختص بتنفيذ إجراء معين وعلى هذا تم تقسم المهام على عدة دوال كالتالي :
* دوال الفئة :
private function load($image){};
public function resize($image,$newWidth = null, $newHeight = null, $saveDir = null, $newImgName = null){};
private function resize_horizontal($newWidth){};
private function resize_vertical($newHeight){};
private function resize_VH($newWidth, $newHeight){};
private function makeNewImg(){};
private function save(){};
public function getErorr(){};
public function delete($image = null){};
1- load دالة خاصة لتحميل بيانات الصورة , الدالة تأخذ وسيط وحيد وهو مسار الصورة و تعيد القيمة الصواب في حالة تحميل الصورة وتعيد القيمة الخطأ عند الفشل في تحميل الصورة .
2- resize دالة عامة لتحجيم الصورة :
- الوسيط الأول اسم الصورة أو مسار الصورة كاملة .
- الوسيط الثاني العرض الجديد للصورة إما بالنسبة المئوية أو النقطية .
- الوسيط الثالث إرتفاع الصورة إما بالنسبة المئوية أو النقطية .
- الوسيط الرابع مجلد وضع الصورة الجديدة والإفتراضي سيكون نفس مجلد الملف .
- الوسيط الخامس اسم الصورة الجديدة والإفتراضي هو نفس اسم الصور المراد إعادة تحجيمها مضافاً إليها لاحقة حتى لايتم إستبدالها بالصورة الأصلية إذا كانت في نفس المجلد .
- الدالة تعيد القيمة الصواب في حالة إعادة تحجيم الصورة وتعيد القيمة الخطأ في حالة فشلها في تحجيم الصورة .
3- resize_horizontal دالة خاصة للتحجيم رأسياً فقط و تأخذ وسيط واحد وهو عرض الصورة الجديد بالنسبة المئوية أو النقطية تعود بالقيمة المعادة من إستدعاء دالة أخرى .
4- resize_vertical دالة خاصة للتحجيم أفقياً فقط و تأخذ وسيط واحد وهو إرتفاع الصورة الجديد بالنسبة المئوية أو النقطية تعود بالقيمة المعادة من إستدعاء دالة أخرى .
5- resize_VH دالة خاصة للتحجيم في الوضع الأفقي والرأسي معاً والدالة تأخذ وسيطين الأول عرض الصورة الجديد والأخر إرتفاع الصورة الجديد إما بالنسبة المئوية أو النقطية تعود هذه الدالة بالقيمة المعادة من إستدعاء دالة أخرى .
6- makeNewImg دالة خاصة لتنفيذ عملية إعادة التحجيم , لا تأخذ أي وسائط و تعود بالقيمة الخطأ في حالة الفشل أو تعود بالقيمة المعادة من إستدعاء دالة أخرى .
7- save دالة خااصة لحفظ الصورة الجديدة بعد عملية التحجيم ولا تأخذ أي وسيط وتعود بالقيمة الصحيحة في حالة نجاحها أو القيمة الخطأ في حالة فشلها .
8- getErorr دالة عامة لجلب نص الخطأ في حالة وجوده وتعود الدالة بقيمة نص الخطأ المخزن في متغير الأخطاء .
9- delete دالة عامة لحذف الصورة وتأخذ وسيط اسم الصورة المراد حذفها أو مسارها وإذا لم يتم إدخال وسيط ستقوم الدالة بحذف الصورة الحالية إن وجدت , تعود بالقيمة الصواب في حالة حذف الصورة وتعود بالقيمة الخطأ في حالة الفشل في حذف الصورة .
* واضح مما سبق أن جميع الدوال خاصة غير دالة resize و getError و delete أي المسموح لك بإستخدامهم فقط أما باقي الدوال فهي خاصة بالفئة ذاتها أي للإستخدام الداخلي فقط .
- بالنسبة لشرح الأكواد الداخلية يمكنك الرجوع للرابط الذي أشرت إليه في الأعلى لكيفية التعامل مع مكتبة الـ GD أما باقي الأكواد فهي من أساسيات اللغة وتم التعرض لها مسبقاً .
والتالي رابط تنزيل الفئة
* كيفية إستخدام الفئة :
- نقوم بتضمين الفئة .
- نقوم بإنشاء كائن من الفئة .
- نستدعي الدالة resize ونسند لها الوسيط الأول وهو مسار الصورة والوسيط الثاني وهو عرض الصورة الجديد والوسيط الثالث وهو إرتفاع الصورة الجديد كالتالي :
<?php
header('Content-Type: text/html; charset=utf-8');
require_once 'myResizeImage.php';
$obj = myResizeImage::getObj();
if($obj->resize('image.png','100px','100px'))
{
echo '<h3>تم حفظ الصورة</h3>';
}
else
{
echo '<h3>'.$obj->getErorr().'</h3>';
}
/*
* تم بحمد الله
*/
?>- كود الـ header لتظهر اللغة العربية بشكل جيد .
- عند إستدعاء الدالة resize وإعطائها مسار الصورة المراد إعادة تحجيمها والأبعاد الجديدة سيتم إنشاء الصورة الجديدة بنفس الإسم مضاف إليه _resized في نفس مسار الصورة الأصلية .
- في حالة فشل الدالة تعود بالقيمة الخطأ false وهذا يعني حدوث خطأ ما , فلهذا نقوم بإستدعاء الدالة getError لطباعة نص الخطأ .
* نحن نعلم أن إعادة تحجيم الصور يؤثر على جودتها في بعض الأحيان ولكن إعادة تحجيم الصور بالنسبة المئوية يحافظ النسبة بين العرض والإرتفاع , ولإستخدام النسبة المئوية في التحجيم فقط أكتب النسبة المئوية للعرض والإرتفاع مباشراً متبوعة بعلامة النسبة المئوية % كالتالي :
if($obj->resize('image.png','50%','50%'))
{
echo '<h3>تم حفظ الصورة</h3>';
}
else
{
echo '<h3>'.$obj->getErorr().'</h3>';
}* ملاحظة : للحفاظ على نسبة العرض إلى الإرتفاع يجب أن تكون النسبة المئوية للعرض والإرتفاع واحدة .
- في بعض الأحيان نحتاج حجم ثابت يتم تحجيم جميع الصور إليه في هذه الحالة ستسخدم الـ px كما في المثال الأول .
- كما يمن إعادة تحجيم أي من العرض أو الإرتفاع فقط إما بالنسبة المئوية % أو النقطية px كالتالي :
if($obj->resize('image.png','50%'))
{
echo '<h3>تم حفظ الصورة</h3>';
}
else
{
echo '<h3>'.$obj->getErorr().'</h3>';
}- المثال السابق لتصغير عرض الصورة فقط بنسبة 50 بالمئة من عرضها الأصلي .
مثال :
if($obj->resize('image.png',null,'200px'))
{
echo '<h3>تم حفظ الصورة</h3>';
}
else
{
echo '<h3>'.$obj->getErorr().'</h3>';
}- المثال السابق يقوم بإعادة تحجيم إرتفاع الصورة فقط إلى 200 بيكسل .
* ولحفظ الصور المعاد تحجيمها في مجلد أخر يتم وضع مسار المجلد في الوسيط الرابع للدالة , فلنفرض أن لدينا مجلد باسم new_images داخل نفس مسار الفئة سيكون الكود كالتالي :
if($obj->resize('image.png','150px','200px','new_images'))
{
echo '<h3>تم حفظ الصورة</h3>';
}
else
{
echo '<h3>'.$obj->getErorr().'</h3>';
}- سيقوم الكود السابق بحفظ الصورة الجديدة في المجلد new_images
* ولإختيار اسم لتخزين الصورة المعاد تحجيمها يتم إعطاء اسم الصورة بدون الإمتداد كوسيط خامس للدالة كالتالي :
if($obj->resize('image.png','150px','200px','new_images','w150xh200'))
{
echo '<h3>تم حفظ الصورة</h3>';
}
else
{
echo '<h3>'.$obj->getErorr().'</h3>';
}- الكود السابق سيقوم بحفظ الصورة الجديدة في المجلد new_images بالاسم w150xh200 مضاف إليه إمتداد الصورة .
ولتجاهل أي من الوسائط عادا الوسيط الأول سنضع القيمة null كالتالي :
if($obj->resize('image.png','150px',null,null,'w150xh200'))
{
echo '<h3>تم حفظ الصورة</h3>';
}
else
{
echo '<h3>'.$obj->getErorr().'</h3>';
}- في المسال السابق قمنا بتجاهل وسيط الإرتفاع أي لن يتم تغيير الإرتفاع ووسيط مجلد الحفظ أي سيتم الحفظ في نفس مسار الفئة مع تغيير اسم الصورة للاسم الموجود في الوسيط الخامس .
* ملاحظة : عند إستخدام صور بها شفافية فمن الأفضل أن تكون الصور من الإمتداد png لأن إعادة بعض الصور من النوع gif والتي توجد بها مدى ألوان يخطى مدى دوال مكتبة GD سيؤدي هذا لضياع هذه المناطق وإستبدالها بلون شفاف تماماً مما سيؤثر سلباً على شكل الصورة الناتجة .
* ملاحظة : لم أقم في الفئة بالتحقق من صلاحيات القراءة والكتابة للملفات أو المجلدات أو تطبيقها من خلال الفئة فيرجى ضبط صلاحية الوصول للمجلدات في حالة ظهور خطأ من هذا النوع .
والسلام عليكم ورحمة الله وبركاته
دمتم في أمان الله