مكتبة Sharp للعمل مع الصور في Node.js
في تطوير الويب الحديث، تعد معالجة الصور على جانب الخادم مهمة بالغة الأهمية. Node.js، بفضل بنيته القائمة على الأحداث، يتعامل مع هذه المهمة بشكل ممتاز. من بين العديد من المكتبات للعمل مع الصور، تحتل Sharp مكانة خاصة - وهي وحدة عالية الأداء مفتوحة المصدر، مكتوبة بلغة C++ وتستخدم مكتبة libvips.
ما هي Sharp؟
Sharp هي وحدة Node.js لمعالجة الصور بسرعة. تدعم تنسيقات JPEG و PNG و WebP و AVIF و TIFF و GIF. تشمل الإمكانيات الرئيسية تغيير الحجم، القص، التدوير، تصحيح الألوان، إضافة العلامات المائية والتحويل بين التنسيقات. بفضل استخدام libvips، تعمل Sharp أسرع بمقدار 4-5 مرات من المكتبات المماثلة (مثل ImageMagick أو GraphicsMagick).
التثبيت
يتم التثبيت عبر npm. تأكد من تثبيت مترجمات C++ (gcc أو clang) و libvips على النظام (على بعض أنظمة التشغيل قد يتطلب التثبيت المسبق).
npm install sharpبعد التثبيت، يمكنك استيراد الوحدة إلى مشروعك:
const sharp = require('sharp');العمليات الأساسية مع الصور
1. تغيير الحجم (resize)
المهمة الأكثر شيوعًا هي تصغير أو تكبير الصورة. تسمح Sharp بتحديد العرض أو الارتفاع أو كليهما معًا. إذا تم تحديد معلمة واحدة فقط، سيتم حساب الثانية بشكل متناسب.
const sharp = require('sharp');
async function resizeImage() { try { await sharp('input.jpg') .resize(300, 200) // العرض 300px، الارتفاع 200px .toFile('output-resized.jpg'); console.log('تم تغيير حجم الصورة'); } catch (error) { console.error('خطأ:', error); }}
resizeImage();للحفاظ على النسب، استخدم fit:
const sharp = require('sharp');
async function resizeWithFit() { await sharp('input.jpg') .resize({ width: 300, height: 200, fit: 'inside' // 'cover', 'contain', 'fill', 'inside', 'outside' }) .toFile('output-fit.jpg');}
resizeWithFit();2. القص (crop)
يسمح القص بإزالة الأجزاء غير المرغوب فيها من الصورة. تدعم Sharp القص بإحداثيات محددة أو وفقًا لاستراتيجية (مثل القص المركزي).
const sharp = require('sharp');
async function cropImage() { await sharp('input.jpg') .extract({ left: 100, top: 50, width: 400, height: 300 }) .toFile('output-cropped.jpg');}
cropImage();يمكنك أيضًا استخدام resize مع خيار crop:
const sharp = require('sharp');
async function cropWithResize() { await sharp('input.jpg') .resize(200, 200, { fit: 'cover', position: 'centre' }) .toFile('output-cover.jpg');}
cropWithResize();3. تحويل التنسيقات
تسمح Sharp بتحويل الصور بسهولة من تنسيق إلى آخر. ما عليك سوى تحديد الامتداد في ملف الإخراج أو استخدام طريقة .toFormat().
const sharp = require('sharp');
async function convertToWebP() { await sharp('input.png') .toFormat('webp') .toFile('output.webp');}
async function convertToJpeg() { await sharp('input.webp') .jpeg({ quality: 80 }) .toFile('output.jpg');}
convertToWebP();convertToJpeg();4. العمل مع البيانات الوصفية
يمكنك استخراج البيانات الوصفية للصورة: الأبعاد، مساحة الألوان، DPI، بيانات EXIF، إلخ.
const sharp = require('sharp');
async function getMetadata() { const metadata = await sharp('input.jpg').metadata(); console.log('البيانات الوصفية:', metadata); // { format: