Output Format 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);
});