Skip to content

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

Liên kết liên quan

Được phát hành theo Giấy phép Apache 2.0.