API форматов вывода
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);
});