Skip to content

واجهة برمجة تطبيقات معالجة الصور

يوفر Sharp وظائف غنية لمعالجة الصور، بما في ذلك تغيير الحجم والقص والتدوير والفلتر وغيرها من العمليات.

تغيير الحجم (resize)

الاستخدام الأساسي

javascript
import sharp from 'sharp';

// تغيير إلى حجم محدد
sharp('input.jpg')
  .resize(300, 200)
  .toFile('output.jpg');

// تحديد العرض فقط، يتم حساب الارتفاع تلقائيًا
sharp('input.jpg')
  .resize(300)
  .toFile('output.jpg');

// تحديد الارتفاع فقط، يتم حساب العرض تلقائيًا
sharp('input.jpg')
  .resize(null, 200)
  .toFile('output.jpg');

خيارات التغيير

javascript
sharp('input.jpg')
  .resize(300, 200, {
    // خوارزمية التغيير
    kernel: sharp.kernel.lanczos3,
    
    // الموضع
    position: 'center',
    
    // لون الخلفية
    background: { r: 255, g: 255, b: 255, alpha: 1 },
    
    // ما إذا كان يجب الحفاظ على نسبة العرض إلى الارتفاع
    fit: 'cover',
    
    // ما إذا كان يجب عدم التكبير
    withoutEnlargement: true,
    
    // ما إذا كان يجب عدم التصغير
    withoutReduction: false
  })
  .toFile('output.jpg');

خوارزميات التغيير

javascript
// خوارزميات التغيير المتاحة
sharp.kernel.nearest      // أقرب جار
sharp.kernel.cubic        // الاستيفاء التكعيبي
sharp.kernel.mitchell     // Mitchell-Netravali
sharp.kernel.lanczos2     // Lanczos 2-lobed
sharp.kernel.lanczos3     // Lanczos 3-lobed (افتراضي)

أوضاع التكيف

javascript
// cover: الحفاظ على نسبة العرض إلى الارتفاع، قص الأجزاء الزائدة
sharp('input.jpg').resize(300, 200, { fit: 'cover' })

// contain: الحفاظ على نسبة العرض إلى الارتفاع، إضافة خلفية
sharp('input.jpg').resize(300, 200, { fit: 'contain' })

// fill: تمديد إلى الحجم المحدد
sharp('input.jpg').resize(300, 200, { fit: 'fill' })

// inside: الحفاظ على نسبة العرض إلى الارتفاع، عدم تجاوز حجم الصورة الأصلية
sharp('input.jpg').resize(300, 200, { fit: 'inside' })

// outside: الحفاظ على نسبة العرض إلى الارتفاع، الوصول على الأقل إلى الحجم المحدد
sharp('input.jpg').resize(300, 200, { fit: 'outside' })

القص (extract)

javascript
// قص منطقة محددة
sharp('input.jpg')
  .extract({ left: 100, top: 100, width: 300, height: 200 })
  .toFile('output.jpg');

// القص وتغيير الحجم
sharp('input.jpg')
  .extract({ left: 100, top: 100, width: 300, height: 200 })
  .resize(150, 100)
  .toFile('output.jpg');

التدوير (rotate)

javascript
// تدوير 90 درجة
sharp('input.jpg')
  .rotate(90)
  .toFile('output.jpg');

// التدوير وتحديد لون الخلفية
sharp('input.jpg')
  .rotate(45, { background: { r: 255, g: 255, b: 255, alpha: 1 } })
  .toFile('output.jpg');

القلب (flip/flop)

javascript
// قلب عمودي
sharp('input.jpg')
  .flip()
  .toFile('output.jpg');

// قلب أفقي
sharp('input.jpg')
  .flop()
  .toFile('output.jpg');

الضبابية (blur)

javascript
// ضبابية غاوسية
sharp('input.jpg')
  .blur(5)
  .toFile('output.jpg');

// الحدّة
sharp('input.jpg')
  .sharpen()
  .toFile('output.jpg');

// معاملات الحدّة المخصصة
sharp('input.jpg')
  .sharpen({
    sigma: 1,
    flat: 1,
    jagged: 2
  })
  .toFile('output.jpg');

الفلاتر (filters)

التدرج الرمادي

javascript
sharp('input.jpg')
  .grayscale()
  .toFile('output.jpg');

الانعكاس

javascript
sharp('input.jpg')
  .negate()
  .toFile('output.jpg');

تصحيح جاما

javascript
sharp('input.jpg')
  .gamma(2.2)
  .toFile('output.jpg');

السطوع/التباين

javascript
sharp('input.jpg')
  .modulate({
    brightness: 1.2,    // السطوع (0.1-2.0)
    saturation: 0.8,    // التشبع (0-2.0)
    hue: 180            // الصبغة (0-360)
  })
  .toFile('output.jpg');

عمليات اللون

فصل الألوان

javascript
sharp('input.jpg')
  .tint({ r: 255, g: 0, b: 0 })
  .toFile('output.jpg');

مصفوفة اللون

javascript
sharp('input.jpg')
  .recomb([
    [0.3588, 0.7044, 0.1368],
    [0.2990, 0.5870, 0.1140],
    [0.0000, 0.0000, 1.0000]
  ])
  .toFile('output.jpg');

عمليات القناة

فصل القنوات

javascript
// الحصول على القناة الحمراء
sharp('input.jpg')
  .extractChannel('red')
  .toFile('red-channel.jpg');

// الحصول على جميع القنوات
const channels = await sharp('input.jpg').separate();

دمج القنوات

javascript
// الدمج من ملفات قنوات منفصلة
sharp('red.jpg')
  .joinChannel(['green.jpg', 'blue.jpg'])
  .toFile('merged.jpg');

عمليات مجمعة

javascript
// عمليات متسلسلة
sharp('input.jpg')
  .resize(800, 600)
  .rotate(90)
  .blur(2)
  .sharpen()
  .jpeg({ quality: 80 })
  .toFile('output.jpg');

تحسين الأداء

المعالجة المتدفقة

javascript
const fs = require('fs');

fs.createReadStream('input.jpg')
  .pipe(sharp().resize(300, 200))
  .pipe(fs.createWriteStream('output.jpg'));

المعالجة المجمعة

javascript
const sharp = require('sharp');
const fs = require('fs').promises;

async function processImages() {
  const files = await fs.readdir('./images');
  
  const promises = files
    .filter(file => file.endsWith('.jpg'))
    .map(async file => {
      await sharp(`./images/${file}`)
        .resize(300, 200)
        .jpeg({ quality: 80 })
        .toFile(`./output/${file}`);
    });
    
  await Promise.all(promises);
}

معالجة الأخطاء

javascript
try {
  await sharp('input.jpg')
    .resize(300, 200)
    .toFile('output.jpg');
} catch (error) {
  console.error('فشلت معالجة الصورة:', error.message);
}

روابط ذات صلة

تم الإصدار بموجب رخصة Apache 2.0.