Skip to content

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     // YCbCr

Chuyể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ắc

Thao 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ám

Thao 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 ra

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

Liên kết liên quan

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