واجهة برمجة تطبيقات تنسيق الإخراج
يدعم Sharp تنسيقات إخراج صور متعددة، ولكل تنسيق خياراته ومواصفاته الخاصة.
تنسيق JPEG
الاستخدام الأساسي
javascript
import sharp from 'sharp';
sharp('input.png')
.jpeg()
.toFile('output.jpg');خيارات JPEG
javascript
sharp('input.png')
.jpeg({
quality: 80, // الجودة (1-100)
progressive: false, // JPEG تدريجي
chromaSubsampling: '4:4:4', // أخذ عينات اللون
mozjpeg: false, // استخدام مشفر mozjpeg
trellisQuantisation: false, // تكميم الشبكة
overshootDeringing: false, // إزالة الرنين الزائد
optimiseScans: false, // تحسين المسح
quantisationTable: 0 // جدول التكميم
})
.toFile('output.jpg');إعدادات الجودة
javascript
// جودة عالية
sharp('input.png').jpeg({ quality: 95 })
// جودة متوسطة
sharp('input.png').jpeg({ quality: 80 })
// جودة منخفضة (ملف صغير)
sharp('input.png').jpeg({ quality: 50 })تنسيق PNG
الاستخدام الأساسي
javascript
sharp('input.jpg')
.png()
.toFile('output.png');خيارات PNG
javascript
sharp('input.jpg')
.png({
progressive: false, // PNG تدريجي
compressionLevel: 6, // مستوى الضغط (0-9)
adaptiveFiltering: false, // التصفية التكيفية
palette: false, // وضع اللوحة
quality: 100, // الجودة (للوحة فقط)
colours: 256, // عدد الألوان (للوحة فقط)
dither: 0.5, // التمويه (0-1)
force: false // فرض إخراج PNG
})
.toFile('output.png');معالجة الشفافية
javascript
// الحفاظ على الشفافية
sharp('input.png')
.png()
.toFile('output.png');
// إضافة خلفية بيضاء
sharp('input.png')
.flatten({ background: { r: 255, g: 255, b: 255 } })
.png()
.toFile('output.png');تنسيق WebP
الاستخدام الأساسي
javascript
sharp('input.jpg')
.webp()
.toFile('output.webp');خيارات WebP
javascript
sharp('input.jpg')
.webp({
quality: 80, // الجودة (1-100)
alphaQuality: 100, // جودة الشفافية (1-100)
lossless: false, // ضغط بدون فقدان
nearLossless: false, // ضغط شبه بدون فقدان
smartSubsample: false, // أخذ عينات ذكي
reductionEffort: 4, // جهد الضغط (0-6)
mixed: false, // الوضع المختلط
force: false // فرض إخراج WebP
})
.toFile('output.webp');WebP بدون فقدان
javascript
// ضغط بدون فقدان
sharp('input.png')
.webp({ lossless: true })
.toFile('output.webp');
// ضغط شبه بدون فقدان
sharp('input.png')
.webp({ nearLossless: true, quality: 60 })
.toFile('output.webp');تنسيق AVIF
الاستخدام الأساسي
javascript
sharp('input.jpg')
.avif()
.toFile('output.avif');خيارات AVIF
javascript
sharp('input.jpg')
.avif({
quality: 80, // الجودة (1-100)
lossless: false, // ضغط بدون فقدان
effort: 4, // جهد الضغط (0-6)
chromaSubsampling: '4:4:4', // أخذ عينات اللون
force: false // فرض إخراج AVIF
})
.toFile('output.avif');تنسيق TIFF
الاستخدام الأساسي
javascript
sharp('input.jpg')
.tiff()
.toFile('output.tiff');خيارات TIFF
javascript
sharp('input.jpg')
.tiff({
quality: 80, // الجودة (1-100)
compression: 'jpeg', // طريقة الضغط
pyramid: false, // وضع الهرم
tile: false, // وضع التجانب
tileSize: 256, // حجم التجانب
xres: 1, // دقة X
yres: 1, // دقة Y
resolutionUnit: 'inch', // وحدة الدقة
force: false // فرض إخراج TIFF
})
.toFile('output.tiff');خيارات الضغط
javascript
// ضغط JPEG
sharp('input.jpg').tiff({ compression: 'jpeg' })
// ضغط LZW
sharp('input.jpg').tiff({ compression: 'lzw' })
// بدون ضغط
sharp('input.jpg').tiff({ compression: 'none' })
// ضغط Deflate
sharp('input.jpg').tiff({ compression: 'deflate' })التنسيق الخام (raw)
إخراج بيانات البكسل الخام
javascript
// إخراج بيانات RGB الخام
const rawData = await sharp('input.jpg')
.raw()
.toBuffer();
// إخراج بيانات RGBA الخام
const rawData = await sharp('input.jpg')
.ensureAlpha()
.raw()
.toBuffer();إخراج متعدد التنسيقات
إخراج تنسيقات متعددة في نفس الوقت
javascript
const image = sharp('input.jpg').resize(800, 600);
// إخراج تنسيقات متعددة
await Promise.all([
image.clone().jpeg({ quality: 80 }).toFile('output.jpg'),
image.clone().png().toFile('output.png'),
image.clone().webp({ quality: 80 }).toFile('output.webp'),
image.clone().avif({ quality: 80 }).toFile('output.avif')
]);الصور المتجاوبة
javascript
async function generateResponsiveImages(inputPath) {
const sizes = [320, 640, 1280, 1920];
const formats = ['jpeg', 'webp', 'avif'];
const promises = [];
for (const size of sizes) {
for (const format of formats) {
const image = sharp(inputPath).resize(size);
switch (format) {
case 'jpeg':
promises.push(
image.clone().jpeg({ quality: 80 })
.toFile(`output-${size}.jpg`)
);
break;
case 'webp':
promises.push(
image.clone().webp({ quality: 80 })
.toFile(`output-${size}.webp`)
);
break;
case 'avif':
promises.push(
image.clone().avif({ quality: 80 })
.toFile(`output-${size}.avif`)
);
break;
}
}
}
await Promise.all(promises);
}اكتشاف التنسيق
اختيار التنسيق تلقائيًا بناءً على امتداد الملف
javascript
function getOutputFormat(filename) {
const ext = filename.split('.').pop().toLowerCase();
switch (ext) {
case 'jpg':
case 'jpeg':
return 'jpeg';
case 'png':
return 'png';
case 'webp':
return 'webp';
case 'avif':
return 'avif';
case 'tiff':
case 'tif':
return 'tiff';
default:
return 'jpeg';
}
}
async function convertImage(inputPath, outputPath) {
const format = getOutputFormat(outputPath);
const image = sharp(inputPath);
switch (format) {
case 'jpeg':
await image.jpeg({ quality: 80 }).toFile(outputPath);
break;
case 'png':
await image.png().toFile(outputPath);
break;
case 'webp':
await image.webp({ quality: 80 }).toFile(outputPath);
break;
case 'avif':
await image.avif({ quality: 80 }).toFile(outputPath);
break;
case 'tiff':
await image.tiff({ compression: 'jpeg' }).toFile(outputPath);
break;
}
}تحسين الأداء
الإخراج المتدفق
javascript
const fs = require('fs');
// المعالجة المتدفقة
fs.createReadStream('input.jpg')
.pipe(sharp().jpeg({ quality: 80 }))
.pipe(fs.createWriteStream('output.jpg'));تحسين الذاكرة
javascript
// استخدام Buffer بدلاً من الملف
const buffer = await sharp('input.jpg')
.jpeg({ quality: 80 })
.toBuffer();
// الإخراج المباشر إلى الاستجابة
app.get('/image', async (req, res) => {
const buffer = await sharp('input.jpg')
.resize(300, 200)
.jpeg({ quality: 80 })
.toBuffer();
res.set('Content-Type', 'image/jpeg');
res.send(buffer);
});