API утилит
Sharp предоставляет множество функций-утилит для помощи в обработке изображений и преобразовании форматов.
Определение формата
Определение поддерживаемых форматов
javascript
import sharp from 'sharp';
// Получение поддерживаемых форматов ввода
console.log('Поддерживаемые форматы ввода:', sharp.format);
// Получение поддерживаемых форматов вывода
console.log('Поддерживаемые форматы вывода:', sharp.format);Проверка формата файла
javascript
async function checkImageFormat(filePath) {
try {
const metadata = await sharp(filePath).metadata();
return {
format: metadata.format,
width: metadata.width,
height: metadata.height,
channels: metadata.channels
};
} catch (error) {
return { error: error.message };
}
}Цветовое пространство
Константы цветового пространства
javascript
// Доступные цветовые пространства
sharp.colourspace.srgb // sRGB
sharp.colourspace.rgb // RGB
sharp.colourspace.cmyk // CMYK
sharp.colourspace.grey // Оттенки серого
sharp.colourspace.multiband // Многоканальное
sharp.colourspace.lab // Lab
sharp.colourspace.xyz // XYZ
sharp.colourspace.ycbcr // YCbCrПреобразование цветового пространства
javascript
// Преобразование в оттенки серого
sharp('input.jpg')
.grayscale()
.toFile('output.jpg');
// Преобразование в CMYK
sharp('input.jpg')
.toColourspace(sharp.colourspace.cmyk)
.tiff()
.toFile('output.tiff');Ядра и фильтры
Ядра изменения размера
javascript
// Доступные ядра изменения размера
sharp.kernel.nearest // Ближайший сосед
sharp.kernel.cubic // Кубическая интерполяция
sharp.kernel.mitchell // Mitchell-Netravali
sharp.kernel.lanczos2 // Lanczos 2-лепестковый
sharp.kernel.lanczos3 // Lanczos 3-лепестковый (по умолчанию)Использование пользовательских ядер
javascript
// Использование пользовательского ядра изменения размера
sharp('input.jpg')
.resize(300, 200, { kernel: sharp.kernel.lanczos3 })
.toFile('output.jpg');Константы позиций
Опции позиций
javascript
// Доступные опции позиций
sharp.position.top // Верх
sharp.position.right // Право
sharp.position.bottom // Низ
sharp.position.left // Лево
sharp.position.center // Центр (по умолчанию)
sharp.position.centre // Центр (британское написание)
sharp.position.north // Север (верх)
sharp.position.east // Восток (право)
sharp.position.south // Юг (низ)
sharp.position.west // Запад (лево)
sharp.position.northeast // Северо-восток
sharp.position.southeast // Юго-восток
sharp.position.southwest // Юго-запад
sharp.position.northwest // Северо-западОперации с каналами
Константы каналов
javascript
// Константы каналов
sharp.channel.red // Красный канал
sharp.channel.green // Зеленый канал
sharp.channel.blue // Синий канал
sharp.channel.alpha // Альфа-канал
sharp.channel.grey // Серый каналОперации с каналами
javascript
// Извлечение красного канала
sharp('input.jpg')
.extractChannel(sharp.channel.red)
.toFile('red-channel.jpg');
// Извлечение всех каналов
const channels = await sharp('input.jpg').separate();Обработка ошибок
Типы ошибок
javascript
// Распространенные ошибки Sharp
sharp.errors.InputError // Ошибка ввода
sharp.errors.ProcessError // Ошибка обработки
sharp.errors.OutputError // Ошибка выводаПример обработки ошибок
javascript
try {
await sharp('input.jpg')
.resize(300, 200)
.toFile('output.jpg');
} catch (error) {
if (error instanceof sharp.errors.InputError) {
console.error('Ошибка входного файла:', error.message);
} else if (error instanceof sharp.errors.ProcessError) {
console.error('Ошибка обработки:', error.message);
} else if (error instanceof sharp.errors.OutputError) {
console.error('Ошибка вывода:', error.message);
} else {
console.error('Неизвестная ошибка:', error.message);
}
}Мониторинг производительности
Использование памяти
javascript
// Получение статистики использования памяти Sharp
const stats = sharp.cache();
console.log('Статистика кэша:', stats);
// Очистка кэша
sharp.cache(false);Управление параллелизмом
javascript
// Установка ограничения параллелизма
sharp.concurrency(4); // Максимум 4 параллельные операции
// Получение текущего количества параллельных операций
console.log('Текущее количество параллельных операций:', sharp.concurrency());Функции-утилиты
Создание тестового изображения
javascript
// Создание одноцветного изображения
const redImage = sharp({
create: {
width: 300,
height: 200,
channels: 3,
background: { r: 255, g: 0, b: 0 }
}
});
// Создание градиентного изображения
const gradient = sharp({
create: {
width: 300,
height: 200,
channels: 3,
background: { r: 0, g: 0, b: 0 }
}
});Композиция изображений
javascript
// Композиция нескольких изображений
const composite = await sharp('background.jpg')
.composite([
{
input: 'overlay.png',
top: 100,
left: 100
}
])
.jpeg()
.toBuffer();Инструменты пакетной обработки
Пакетное изменение размера
javascript
const fs = require('fs').promises;
async function batchResize(inputDir, outputDir, width, height) {
const files = await fs.readdir(inputDir);
for (const file of files) {
if (file.match(/\.(jpg|jpeg|png|webp)$/i)) {
try {
await sharp(`${inputDir}/${file}`)
.resize(width, height)
.jpeg({ quality: 80 })
.toFile(`${outputDir}/${file}`);
console.log(`Обработка завершена: ${file}`);
} catch (error) {
console.error(`Не удалось обработать ${file}:`, error.message);
}
}
}
}Пакетное преобразование форматов
javascript
async function batchConvert(inputDir, outputDir, format) {
const files = await fs.readdir(inputDir);
for (const file of files) {
if (file.match(/\.(jpg|jpeg|png|webp)$/i)) {
const outputFile = file.replace(/\.[^.]+$/, `.${format}`);
try {
const image = sharp(`${inputDir}/${file}`);
switch (format) {
case 'jpg':
case 'jpeg':
await image.jpeg({ quality: 80 }).toFile(`${outputDir}/${outputFile}`);
break;
case 'png':
await image.png().toFile(`${outputDir}/${outputFile}`);
break;
case 'webp':
await image.webp({ quality: 80 }).toFile(`${outputDir}/${outputFile}`);
break;
case 'avif':
await image.avif({ quality: 80 }).toFile(`${outputDir}/${outputFile}`);
break;
}
console.log(`Преобразование завершено: ${file} -> ${outputFile}`);
} catch (error) {
console.error(`Не удалось преобразовать ${file}:`, error.message);
}
}
}
}Инструменты проверки
Проверка целостности изображения
javascript
async function validateImage(filePath) {
try {
const metadata = await sharp(filePath).metadata();
// Проверка основных свойств
if (!metadata.width || !metadata.height) {
return { valid: false, error: 'Отсутствует информация о размерах' };
}
if (metadata.width <= 0 || metadata.height <= 0) {
return { valid: false, error: 'Неверные размеры' };
}
if (!metadata.format) {
return { valid: false, error: 'Отсутствует информация о формате' };
}
// Попытка обработки изображения
await sharp(filePath).resize(1, 1).toBuffer();
return { valid: true, metadata };
} catch (error) {
return { valid: false, error: error.message };
}
}Проверка размера файла
javascript
const fs = require('fs');
function checkFileSize(filePath, maxSize = 10 * 1024 * 1024) { // 10MB
const stats = fs.statSync(filePath);
const sizeInMB = stats.size / (1024 * 1024);
return {
size: stats.size,
sizeInMB,
isValid: stats.size <= maxSize,
maxSizeInMB: maxSize / (1024 * 1024)
};
}