API Xử lý hình ảnh
Sharp cung cấp các chức năng xử lý hình ảnh phong phú, bao gồm thay đổi kích thước, cắt, xoay, bộ lọc và các thao tác khác.
Thay đổi kích thước (resize)
Cách sử dụng cơ bản
javascript
import sharp from 'sharp';
// Thay đổi đến kích thước chỉ định
sharp('input.jpg')
.resize(300, 200)
.toFile('output.jpg');
// Chỉ chỉ định chiều rộng, chiều cao tự động tính toán
sharp('input.jpg')
.resize(300)
.toFile('output.jpg');
// Chỉ chỉ định chiều cao, chiều rộng tự động tính toán
sharp('input.jpg')
.resize(null, 200)
.toFile('output.jpg');Tùy chọn điều chỉnh
javascript
sharp('input.jpg')
.resize(300, 200, {
// Thuật toán điều chỉnh
kernel: sharp.kernel.lanczos3,
// Vị trí
position: 'center',
// Màu nền
background: { r: 255, g: 255, b: 255, alpha: 1 },
// Có giữ tỷ lệ khung hình không
fit: 'cover',
// Có không phóng to không
withoutEnlargement: true,
// Có không thu nhỏ không
withoutReduction: false
})
.toFile('output.jpg');Thuật toán điều chỉnh
javascript
// Các thuật toán đ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)Chế độ phù hợp
javascript
// cover: Giữ tỷ lệ khung hình, cắt phần vượt quá
sharp('input.jpg').resize(300, 200, { fit: 'cover' })
// contain: Giữ tỷ lệ khung hình, thêm nền
sharp('input.jpg').resize(300, 200, { fit: 'contain' })
// fill: Kéo dãn đến kích thước chỉ định
sharp('input.jpg').resize(300, 200, { fit: 'fill' })
// inside: Giữ tỷ lệ khung hình, không vượt quá kích thước gốc
sharp('input.jpg').resize(300, 200, { fit: 'inside' })
// outside: Giữ tỷ lệ khung hình, ít nhất đạt kích thước chỉ định
sharp('input.jpg').resize(300, 200, { fit: 'outside' })Cắt (extract)
javascript
// Cắt vùng chỉ định
sharp('input.jpg')
.extract({ left: 100, top: 100, width: 300, height: 200 })
.toFile('output.jpg');
// Cắt và thay đổi kích thước
sharp('input.jpg')
.extract({ left: 100, top: 100, width: 300, height: 200 })
.resize(150, 100)
.toFile('output.jpg');Xoay (rotate)
javascript
// Xoay 90 độ
sharp('input.jpg')
.rotate(90)
.toFile('output.jpg');
// Xoay và chỉ định màu nền
sharp('input.jpg')
.rotate(45, { background: { r: 255, g: 255, b: 255, alpha: 1 } })
.toFile('output.jpg');Lật (flip/flop)
javascript
// Lật dọc
sharp('input.jpg')
.flip()
.toFile('output.jpg');
// Lật ngang
sharp('input.jpg')
.flop()
.toFile('output.jpg');Làm mờ (blur)
javascript
// Làm mờ Gaussian
sharp('input.jpg')
.blur(5)
.toFile('output.jpg');
// Làm sắc nét
sharp('input.jpg')
.sharpen()
.toFile('output.jpg');
// Tham số làm sắc nét tùy chỉnh
sharp('input.jpg')
.sharpen({
sigma: 1,
flat: 1,
jagged: 2
})
.toFile('output.jpg');Bộ lọc (filters)
Độ xám
javascript
sharp('input.jpg')
.grayscale()
.toFile('output.jpg');Đảo ngược
javascript
sharp('input.jpg')
.negate()
.toFile('output.jpg');Hiệu chỉnh gamma
javascript
sharp('input.jpg')
.gamma(2.2)
.toFile('output.jpg');Độ sáng/Độ tương phản
javascript
sharp('input.jpg')
.modulate({
brightness: 1.2, // Độ sáng (0.1-2.0)
saturation: 0.8, // Độ bão hòa (0-2.0)
hue: 180 // Sắc độ (0-360)
})
.toFile('output.jpg');Thao tác màu
Tách sắc độ
javascript
sharp('input.jpg')
.tint({ r: 255, g: 0, b: 0 })
.toFile('output.jpg');Ma trận màu
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');Thao tác kênh
Tách kênh
javascript
// Lấy kênh đỏ
sharp('input.jpg')
.extractChannel('red')
.toFile('red-channel.jpg');
// Lấy tất cả các kênh
const channels = await sharp('input.jpg').separate();Hợp nhất kênh
javascript
// Hợp nhất từ các tệp kênh riêng biệt
sharp('red.jpg')
.joinChannel(['green.jpg', 'blue.jpg'])
.toFile('merged.jpg');Thao tác kết hợp
javascript
// Thao tác chuỗi
sharp('input.jpg')
.resize(800, 600)
.rotate(90)
.blur(2)
.sharpen()
.jpeg({ quality: 80 })
.toFile('output.jpg');Tối ưu hiệu suất
Xử lý luồng
javascript
const fs = require('fs');
fs.createReadStream('input.jpg')
.pipe(sharp().resize(300, 200))
.pipe(fs.createWriteStream('output.jpg'));Xử lý hàng loạt
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);
}Xử lý lỗi
javascript
try {
await sharp('input.jpg')
.resize(300, 200)
.toFile('output.jpg');
} catch (error) {
console.error('Xử lý hình ảnh thất bại:', error.message);
}