API Tiện ích
Sharp cung cấp nhiều hàm tiện ích để hỗ trợ xử lý hình ảnh và chuyển đổi định dạng.
Phát hiện định dạng
Phát hiện định dạng được hỗ trợ
javascript
import sharp from 'sharp';
// Lấy định dạng đầu vào được hỗ trợ
console.log('Định dạng đầu vào được hỗ trợ:', sharp.format);
// Lấy định dạng đầu ra được hỗ trợ
console.log('Định dạng đầu ra được hỗ trợ:', sharp.format);Kiểm tra định dạng tệp
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 };
}
}Không gian màu
Hằng số không gian màu
javascript
// Các không gian màu có sẵn
sharp.colourspace.srgb // sRGB
sharp.colourspace.rgb // RGB
sharp.colourspace.cmyk // CMYK
sharp.colourspace.grey // Độ xám
sharp.colourspace.multiband // Đa băng tần
sharp.colourspace.lab // Lab
sharp.colourspace.xyz // XYZ
sharp.colourspace.ycbcr // YCbCrChuyển đổi không gian màu
javascript
// Chuyển đổi sang độ xám
sharp('input.jpg')
.grayscale()
.toFile('output.jpg');
// Chuyển đổi sang CMYK
sharp('input.jpg')
.toColourspace(sharp.colourspace.cmyk)
.tiff()
.toFile('output.tiff');Kernel và bộ lọc
Kernel điều chỉnh
javascript
// Các kernel điều chỉnh có sẵn
sharp.kernel.nearest // Lân cận gần nhất
sharp.kernel.cubic // Nội suy bậc ba
sharp.kernel.mitchell // Mitchell-Netravali
sharp.kernel.lanczos2 // Lanczos 2-lobed
sharp.kernel.lanczos3 // Lanczos 3-lobed (mặc định)Sử dụng kernel tùy chỉnh
javascript
// Sử dụng kernel điều chỉnh tùy chỉnh
sharp('input.jpg')
.resize(300, 200, { kernel: sharp.kernel.lanczos3 })
.toFile('output.jpg');Hằng số vị trí
Tùy chọn vị trí
javascript
// Các tùy chọn vị trí có sẵn
sharp.position.top // Trên cùng
sharp.position.right // Bên phải
sharp.position.bottom // Dưới cùng
sharp.position.left // Bên trái
sharp.position.center // Trung tâm (mặc định)
sharp.position.centre // Trung tâm (cách viết Anh)
sharp.position.north // Bắc (trên cùng)
sharp.position.east // Đông (bên phải)
sharp.position.south // Nam (dưới cùng)
sharp.position.west // Tây (bên trái)
sharp.position.northeast // Đông Bắc
sharp.position.southeast // Đông Nam
sharp.position.southwest // Tây Nam
sharp.position.northwest // Tây BắcThao tác kênh
Hằng số kênh
javascript
// Hằng số kênh
sharp.channel.red // Kênh đỏ
sharp.channel.green // Kênh xanh lá
sharp.channel.blue // Kênh xanh dương
sharp.channel.alpha // Kênh độ trong suốt
sharp.channel.grey // Kênh độ xámThao tác kênh
javascript
// Trích xuất kênh đỏ
sharp('input.jpg')
.extractChannel(sharp.channel.red)
.toFile('red-channel.jpg');
// Trích xuất tất cả các kênh
const channels = await sharp('input.jpg').separate();Xử lý lỗi
Loại lỗi
javascript
// Các lỗi Sharp phổ biến
sharp.errors.InputError // Lỗi đầu vào
sharp.errors.ProcessError // Lỗi xử lý
sharp.errors.OutputError // Lỗi đầu raVí dụ xử lý lỗi
javascript
try {
await sharp('input.jpg')
.resize(300, 200)
.toFile('output.jpg');
} catch (error) {
if (error instanceof sharp.errors.InputError) {
console.error('Lỗi tệp đầu vào:', error.message);
} else if (error instanceof sharp.errors.ProcessError) {
console.error('Lỗi xử lý:', error.message);
} else if (error instanceof sharp.errors.OutputError) {
console.error('Lỗi đầu ra:', error.message);
} else {
console.error('Lỗi không xác định:', error.message);
}
}Giám sát hiệu suất
Sử dụng bộ nhớ
javascript
// Lấy tình trạng sử dụng bộ nhớ Sharp
const stats = sharp.cache();
console.log('Thống kê bộ nhớ đệm:', stats);
// Xóa bộ nhớ đệm
sharp.cache(false);Điều khiển đồng thời
javascript
// Thiết lập giới hạn đồng thời
sharp.concurrency(4); // Tối đa 4 thao tác đồng thời
// Lấy số đồng thời hiện tại
console.log('Số đồng thời hiện tại:', sharp.concurrency());Hàm tiện ích
Tạo hình ảnh kiểm tra
javascript
// Tạo hình ảnh màu thuần
const redImage = sharp({
create: {
width: 300,
height: 200,
channels: 3,
background: { r: 255, g: 0, b: 0 }
}
});
// Tạo hình ảnh gradient
const gradient = sharp({
create: {
width: 300,
height: 200,
channels: 3,
background: { r: 0, g: 0, b: 0 }
}
});Tổng hợp hình ảnh
javascript
// Tổng hợp nhiều hình ảnh
const composite = await sharp('background.jpg')
.composite([
{
input: 'overlay.png',
top: 100,
left: 100
}
])
.jpeg()
.toBuffer();Công cụ xử lý hàng loạt
Thay đổi kích thước hàng loạt
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(`Xử lý hoàn tất: ${file}`);
} catch (error) {
console.error(`Xử lý thất bại ${file}:`, error.message);
}
}
}
}Chuyển đổi định dạng hàng loạt
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(`Chuyển đổi hoàn tất: ${file} -> ${outputFile}`);
} catch (error) {
console.error(`Chuyển đổi thất bại ${file}:`, error.message);
}
}
}
}Công cụ xác thực
Xác thực tính toàn vẹn hình ảnh
javascript
async function validateImage(filePath) {
try {
const metadata = await sharp(filePath).metadata();
// Kiểm tra các thuộc tính cơ bản
if (!metadata.width || !metadata.height) {
return { valid: false, error: 'Thiếu thông tin kích thước' };
}
if (metadata.width <= 0 || metadata.height <= 0) {
return { valid: false, error: 'Kích thước không hợp lệ' };
}
if (!metadata.format) {
return { valid: false, error: 'Thiếu thông tin định dạng' };
}
// Thử xử lý hình ảnh
await sharp(filePath).resize(1, 1).toBuffer();
return { valid: true, metadata };
} catch (error) {
return { valid: false, error: error.message };
}
}Kiểm tra kích thước tệp
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)
};
}