API Định dạng đầu ra
Sharp hỗ trợ nhiều định dạng đầu ra hình ảnh, mỗi định dạng có các tùy chọn và mục đích riêng.
Định dạng JPEG
Cách sử dụng cơ bản
javascript
import sharp from 'sharp';
sharp('input.png')
.jpeg()
.toFile('output.jpg');Tùy chọn JPEG
javascript
sharp('input.png')
.jpeg({
quality: 80, // Chất lượng (1-100)
progressive: false, // JPEG lũy tiến
chromaSubsampling: '4:4:4', // Lấy mẫu phụ màu
mozjpeg: false, // Sử dụng bộ mã hóa mozjpeg
trellisQuantisation: false, // Lượng tử hóa trellis
overshootDeringing: false, // Khử nhiễu overshoot
optimiseScans: false, // Tối ưu hóa quét
quantisationTable: 0 // Bảng lượng tử hóa
})
.toFile('output.jpg');Thiết lập chất lượng
javascript
// Chất lượng cao
sharp('input.png').jpeg({ quality: 95 })
// Chất lượng trung bình
sharp('input.png').jpeg({ quality: 80 })
// Chất lượng thấp (tệp nhỏ)
sharp('input.png').jpeg({ quality: 50 })Định dạng PNG
Cách sử dụng cơ bản
javascript
sharp('input.jpg')
.png()
.toFile('output.png');Tùy chọn PNG
javascript
sharp('input.jpg')
.png({
progressive: false, // PNG lũy tiến
compressionLevel: 6, // Mức độ nén (0-9)
adaptiveFiltering: false, // Lọc thích ứng
palette: false, // Chế độ bảng màu
quality: 100, // Chất lượng (chỉ dùng cho chế độ bảng màu)
colours: 256, // Số lượng màu (chỉ dùng cho chế độ bảng màu)
dither: 0.5, // Dithering (0-1)
force: false // Buộc đầu ra PNG
})
.toFile('output.png');Xử lý độ trong suốt
javascript
// Giữ độ trong suốt
sharp('input.png')
.png()
.toFile('output.png');
// Thêm nền trắng
sharp('input.png')
.flatten({ background: { r: 255, g: 255, b: 255 } })
.png()
.toFile('output.png');Định dạng WebP
Cách sử dụng cơ bản
javascript
sharp('input.jpg')
.webp()
.toFile('output.webp');Tùy chọn WebP
javascript
sharp('input.jpg')
.webp({
quality: 80, // Chất lượng (1-100)
alphaQuality: 100, // Chất lượng độ trong suốt (1-100)
lossless: false, // Nén không mất mát
nearLossless: false, // Nén gần như không mất mát
smartSubsample: false, // Lấy mẫu phụ thông minh
reductionEffort: 4, // Nỗ lực nén (0-6)
mixed: false, // Chế độ hỗn hợp
force: false // Buộc đầu ra WebP
})
.toFile('output.webp');WebP không mất mát
javascript
// Nén không mất mát
sharp('input.png')
.webp({ lossless: true })
.toFile('output.webp');
// Nén gần như không mất mát
sharp('input.png')
.webp({ nearLossless: true, quality: 60 })
.toFile('output.webp');Định dạng AVIF
Cách sử dụng cơ bản
javascript
sharp('input.jpg')
.avif()
.toFile('output.avif');Tùy chọn AVIF
javascript
sharp('input.jpg')
.avif({
quality: 80, // Chất lượng (1-100)
lossless: false, // Nén không mất mát
effort: 4, // Nỗ lực nén (0-6)
chromaSubsampling: '4:4:4', // Lấy mẫu phụ màu
force: false // Buộc đầu ra AVIF
})
.toFile('output.avif');Định dạng TIFF
Cách sử dụng cơ bản
javascript
sharp('input.jpg')
.tiff()
.toFile('output.tiff');Tùy chọn TIFF
javascript
sharp('input.jpg')
.tiff({
quality: 80, // Chất lượng (1-100)
compression: 'jpeg', // Phương thức nén
pyramid: false, // Chế độ kim tự tháp
tile: false, // Chế độ lát gạch
tileSize: 256, // Kích thước lát gạch
xres: 1, // Độ phân giải X
yres: 1, // Độ phân giải Y
resolutionUnit: 'inch', // Đơn vị độ phân giải
force: false // Buộc đầu ra TIFF
})
.toFile('output.tiff');Tùy chọn nén
javascript
// Nén JPEG
sharp('input.jpg').tiff({ compression: 'jpeg' })
// Nén LZW
sharp('input.jpg').tiff({ compression: 'lzw' })
// Không nén
sharp('input.jpg').tiff({ compression: 'none' })
// Nén Deflate
sharp('input.jpg').tiff({ compression: 'deflate' })Định dạng thô (raw)
Đầu ra dữ liệu pixel thô
javascript
// Đầu ra dữ liệu RGB thô
const rawData = await sharp('input.jpg')
.raw()
.toBuffer();
// Đầu ra dữ liệu RGBA thô
const rawData = await sharp('input.jpg')
.ensureAlpha()
.raw()
.toBuffer();Đầu ra đa định dạng
Đầu ra nhiều định dạng cùng lúc
javascript
const image = sharp('input.jpg').resize(800, 600);
// Đầu ra nhiều định dạng
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')
]);Hình ảnh đáp ứng
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);
}Phát hiện định dạng
Tự động chọn định dạng theo phần mở rộng tệp
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;
}
}Tối ưu hiệu suất
Đầu ra luồng
javascript
const fs = require('fs');
// Xử lý luồng
fs.createReadStream('input.jpg')
.pipe(sharp().jpeg({ quality: 80 }))
.pipe(fs.createWriteStream('output.jpg'));Tối ưu bộ nhớ
javascript
// Sử dụng Buffer thay vì tệp
const buffer = await sharp('input.jpg')
.jpeg({ quality: 80 })
.toBuffer();
// Đầu ra trực tiếp đến phản hồi
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);
});