البرمجة

رسم الصور باستخدام Canvas وجافاسكربت

التعامل مع العنصر Canvas باستخدام جافاسكربت (رسم الصور)

يعتبر عنصر Canvas في HTML من أهم العناصر التي تقدم واجهة مرنة وقوية للرسم والتحكم بالرسومات البيانية والصور على صفحات الويب. ومن خلال لغة جافاسكربت، يمكن التحكم بشكل كامل في هذا العنصر لإنشاء رسوم متحركة، أشكال هندسية، أو حتى معالجة الصور وعرضها بشكل ديناميكي. في هذا المقال سيتم تناول كيفية التعامل مع عنصر Canvas باستخدام جافاسكربت بشكل موسع، مع التركيز على تقنية رسم الصور، وأساليب التحكم بها، وشرح تفصيلي للوظائف التي توفرها API الخاصة بعنصر Canvas.


مفهوم عنصر Canvas في HTML5

عنصر Canvas هو عنصر HTML5 يتيح للمطورين رسم الرسومات ثنائية الأبعاد داخل صفحة الويب. يتم التعامل مع Canvas من خلال جافاسكربت التي توفر مجموعة واسعة من الدوال التي تمكن من الرسم الديناميكي على مساحة الرسم، والتي تعرف “بالتصميم (context)”، حيث يكون نوع التصميم غالبًا ثنائي الأبعاد 2D.

الميزتان الأساسيتان لعناصر Canvas هما:

  • عدم وجود محتوى داخلي يمكن قراءته أو نسخه، حيث يعتبر مساحة للرسم فقط ولا يمكن تهيئته عبر HTML مباشرة.

  • الرسم ديناميكي بالكامل عبر جافاسكربت، مما يعطي تحكمًا مرنًا في إنشاء الرسومات أو معالجة الصور.


تهيئة عنصر Canvas في HTML

للبدء باستخدام Canvas، نحتاج أولاً إلى إضافة العنصر في صفحة HTML مع تحديد أبعاده (العرض والارتفاع) التي تحدد مساحة الرسم:

html
<canvas id="myCanvas" width="800" height="600">canvas>

العرض والارتفاع يمكن ضبطهما حسب الحاجة، ويجب ملاحظتهما لأنهما يؤثران بشكل مباشر على جودة ودقة الرسومات المرسومة. إذا تم ضبط الأبعاد عبر CSS فقط دون تعديل خصائص العرض والارتفاع في خصائص العنصر نفسها، قد يحدث تشويه في الرسم.


الحصول على سياق الرسم 2D باستخدام جافاسكربت

بعد تحديد العنصر في HTML، يجب على جافاسكربت الوصول إليه والحصول على “سياق الرسم” الذي يمثل الواجهة البرمجية لرسم الصور والأشكال.

javascript
const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d');

في السطر الثاني، نحصل على السياق ثنائي الأبعاد 2d الذي يمكّن من استخدام دوال الرسم الأساسية والمتقدمة.


رسم الصور على Canvas

1. تحميل الصورة

قبل رسم صورة على Canvas، يجب تحميلها أولاً. يتم ذلك باستخدام كائن Image في جافاسكربت.

javascript
const image = new Image(); image.src = 'path/to/image.jpg';

يجب الانتباه إلى أن تحميل الصورة عملية غير متزامنة (asynchronous)، بمعنى أن تحميل الصورة يستغرق وقتًا ولا يمكن استخدام الصورة للرسم إلا بعد تحميلها تمامًا.

2. رسم الصورة على Canvas

يتم استخدام الدالة drawImage لرسم الصورة على مساحة الـ Canvas بعد تحميلها.

javascript
image.onload = function() { ctx.drawImage(image, 0, 0); };

في هذا المثال، الصورة تُرسم بدءًا من نقطة الأصل (0,0) في Canvas.

3. التحكم في حجم الصورة ومكانها

الدالة drawImage تدعم أكثر من شكل استدعاء، ويمكن تحديد أبعاد الصورة المرسومة ومكانها داخل الـ Canvas.

الشكل الأساسي:

javascript
ctx.drawImage(image, x, y);

لرسم الصورة بمكان محدد (x, y).

أما الشكل الموسع الأكثر استخدامًا فهو:

javascript
ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);

حيث:

  • sx, sy: إحداثيات البداية داخل الصورة الأصلية.

  • sWidth, sHeight: عرض وارتفاع المنطقة المقتطعة من الصورة الأصلية.

  • dx, dy: إحداثيات النقطة التي تبدأ عندها رسم الصورة على Canvas.

  • dWidth, dHeight: العرض والارتفاع النهائيان للصورة المرسومة على Canvas.

هذا الشكل يتيح قص جزء معين من الصورة ورسمه بحجم محدد على الـ Canvas.


تطبيق عملي: رسم صورة وتعديل أبعادها

javascript
const image = new Image(); image.src = 'image.jpg'; image.onload = function() { // رسم الصورة بالكامل في الحجم الأصلي ctx.drawImage(image, 0, 0); // رسم جزء من الصورة على حجم مختلف ctx.drawImage(image, 50, 50, 100, 100, 200, 200, 150, 150); };

في هذا المثال، يتم رسم الصورة كاملة بداية من النقطة (0,0) ثم يتم رسم جزء مقطوع من الصورة بدءًا من (50,50) بمساحة 100×100 بيكسل، ويُرسم هذا الجزء عند الإحداثيات (200,200) بحجم 150×150 بيكسل.


التعامل مع الصور الديناميكية

في بعض التطبيقات، قد ترغب في التعامل مع الصور التي يتم إنشاؤها أو معالجتها ديناميكيًا. على سبيل المثال، تطبيقات تحرير الصور، أو إنشاء مؤثرات على الصور قبل عرضها.

تعديل الصور عبر Canvas

يمكن تعديل صور تم تحميلها عبر الرسم على Canvas ومن ثم استخدام الدالة getImageData لالتقاط بيانات البكسلات.

javascript
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);

هذه الدالة ترجع كائنًا يحتوي على مصفوفة تحتوي على قيم ألوان كل بيكسل. يمكن تعديل هذه البيانات لتغيير الألوان، السطوع، أو أي تأثيرات أخرى، ثم إعادة رسمها على Canvas عبر:

javascript
ctx.putImageData(imageData, 0, 0);

استخدام Canvas لرسم صور متحركة

باستخدام Canvas يمكن رسم صور متحركة عبر تحديث موقع الرسم باستمرار داخل حلقة زمنية (loop) باستخدام requestAnimationFrame.

مثال بسيط على تحريك صورة:

javascript
const image = new Image(); image.src = 'sprite.png'; let x = 0; function animate() { ctx.clearRect(0, 0, canvas.width, canvas.height); // مسح الإطار السابق ctx.drawImage(image, x, 50); // رسم الصورة في الموقع الجديد x += 2; // زيادة الموقع على محور X if (x > canvas.width) x = -image.width; // إعادة التعيين لنقطة البداية requestAnimationFrame(animate); // استدعاء التحديث القادم } image.onload = function() { animate(); };

دمج Canvas مع HTML وCSS

يمكن تضمين عنصر Canvas داخل صفحات HTML مع التحكم في مظهره باستخدام CSS. على سبيل المثال، يمكن وضع Canvas في مكان معين، ضبط طبقة العرض (z-index)، أو تعيين خلفيات معينة.

css
canvas { border: 1px solid black; background-color: #f0f0f0; display: block; margin: 0 auto; }

نصائح هامة عند العمل مع Canvas ورسم الصور

  1. حجم Canvas وأبعاده

    يجب تحديد أبعاد الـ Canvas باستخدام خصائص width و height داخل العنصر نفسه، وليس فقط عبر CSS لتجنب التشويش أو التمدد غير المرغوب فيه.

  2. تحميل الصور بشكل صحيح

    يجب الانتظار حتى يتم تحميل الصورة بالكامل (image.onload) قبل محاولة رسمها على Canvas.

  3. إدارة الذاكرة

    عند تحديث الرسومات بشكل متكرر (كالرسوم المتحركة)، من المهم مسح محتوى Canvas قبل الرسم مرة أخرى باستخدام clearRect لتجنب تراكب الرسومات.

  4. تعامل مع DPI

    مع شاشات ذات دقة عالية (Retina Displays)، قد يحتاج الـ Canvas إلى ضبط أبعاده الفعلية حسب نسبة البكسل الحقيقي لضمان جودة الرسم.


مقارنة بين طرق رسم الصور على Canvas

الطريقة الوصف الاستخدام الأساسي المميزات العيوب
drawImage(image, x, y) رسم الصورة الأصلية بحجمها عرض الصورة كاملة سهل وبسيط لا يمكن تعديل الحجم
drawImage(image, x, y, width, height) رسم الصورة مع تغيير الحجم تغيير أبعاد الصورة عند العرض مرونة في الحجم قد تفقد جودة الصورة عند التكبير
drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) قص جزء من الصورة ورسمه بحجم معين عرض جزء محدد من الصورة تحكم عالي في القص والرسم معقد نسبياً

استخدام Canvas في تطبيقات متقدمة مع الصور

  • تحرير الصور: يمكن رسم الصور على Canvas، تعديلها عبر تعديل بيانات البيكسل، ثم تصدير الصورة المعدلة.

  • معالجة الصور: تطبيق مؤثرات مثل التدرجات اللونية، التباين، التشويش، أو تحويل الصورة إلى أبيض وأسود.

  • الألعاب: استخدام Canvas لرسم sprites متعددة وتحديث أماكنها في كل إطار.

  • الرسوم البيانية: دمج الصور مع الرسوم البيانية المتقدمة لتقديم محتوى غني ومرئي.


تصدير الصور من Canvas

يمكن تصدير محتوى Canvas إلى صورة بصيغة PNG أو JPEG باستخدام دالة toDataURL:

javascript
const dataURL = canvas.toDataURL('image/png');

الناتج هو سلسلة نصية تحتوي على الصورة بصيغة Base64 يمكن استخدامها لعرض الصورة أو حفظها على الخادم.


الأداء والتحسينات

  • عند التعامل مع صور كبيرة الحجم أو رسوم متحركة مكثفة، من المهم تحسين أداء الرسم.

  • تقليل عدد عمليات إعادة الرسم.

  • استخدام طبقات متعددة أو canvases متعددة لتقليل عمليات المسح وإعادة الرسم.

  • الاستفادة من ذاكرة التخزين المؤقت للصور لتقليل تحميلها مرات متعددة.


خلاصة

يعد عنصر Canvas مع جافاسكربت أداة فعالة ومرنة لرسم الصور والتحكم بها على صفحات الويب. من تحميل الصور ورسمها بشكل مباشر إلى تعديل بيانات البيكسلات وتحريك الصور، يوفر Canvas مجموعة واسعة من الإمكانيات التي يمكن استغلالها في تصميم واجهات تفاعلية وتطبيقات ويب متقدمة. التحكم الدقيق بأبعاد الصورة، قص الأجزاء المطلوبة، تطبيق المؤثرات، وإعادة التصدير جميعها مهام يمكن إنجازها بسهولة عبر API العنصر. مع التزام ممارسات صحيحة مثل تحميل الصور بشكل صحيح، وضبط أبعاد الـ Canvas، وإدارة أداء الرسم، يمكن بناء تجارب مستخدم بصرية عالية الجودة تنافس التطبيقات الأصلية.


المصادر والمراجع

  1. MDN Web Docs – Using Canvas

  2. HTML Canvas API Reference – W3Schools