Skip to content

Sharp 構造函數

Sharp 是 Node.js 的高性能圖像處理庫。構造函數是使用 Sharp 的起點。

基本用法

javascript
import sharp from 'sharp';

// 從文件路徑創建 Sharp 實例
const image = sharp('input.jpg');

// 從 Buffer 創建 Sharp 實例
const image = sharp(inputBuffer);

// 從 Stream 創建 Sharp 實例
const image = sharp(inputStream);

構造函數參數

輸入源

Sharp 構造函數接受多種輸入源:

javascript
// 文件路徑
sharp('input.jpg')

// Buffer
sharp(buffer)

// Stream
sharp(stream)

// URL
sharp('https://example.com/image.jpg')

// 多個輸入源
sharp(['input1.jpg', 'input2.jpg'])

選項對象

javascript
sharp(input, {
  // 輸入選項
  input: {
    failOnError: false,
    limitInputPixels: 268402689,
    sequentialRead: false
  },
  
  // 頁面選項(用於多頁圖像)
  pages: -1,
  
  // 原始選項
  raw: {
    width: 1920,
    height: 1080,
    channels: 3
  }
})

輸入選項

failOnError

  • 類型: boolean
  • 默認值: true
  • 描述: 當遇到錯誤時是否拋出異常
javascript
sharp('input.jpg', { failOnError: false })
  .resize(300, 200)
  .toFile('output.jpg')
  .catch(err => console.log('處理失敗:', err));

limitInputPixels

  • 類型: number
  • 默認值: 268402689 (16384 x 16384)
  • 描述: 限制輸入圖像的像素數量
javascript
sharp('large-image.jpg', { 
  limitInputPixels: 100000000 
})

sequentialRead

  • 類型: boolean
  • 默認值: false
  • 描述: 是否按順序讀取圖像數據
javascript
sharp('input.jpg', { sequentialRead: true })

多頁圖像

對於多頁圖像(如 TIFF、PDF),可以指定要處理的頁面:

javascript
// 處理所有頁面
sharp('multi-page.tiff', { pages: -1 })

// 處理特定頁面(從0開始)
sharp('multi-page.tiff', { pages: 0 })

// 處理多個頁面
sharp('multi-page.tiff', { pages: [0, 2, 4] })

原始圖像數據

處理原始圖像數據時,需要指定尺寸和通道數:

javascript
sharp(rawBuffer, {
  raw: {
    width: 1920,
    height: 1080,
    channels: 3  // RGB
  }
})

錯誤處理

javascript
try {
  const image = sharp('input.jpg');
  await image.toFile('output.jpg');
} catch (error) {
  console.error('圖像處理失敗:', error.message);
}

性能提示

  1. 重用實例: 盡可能重用 Sharp 實例
  2. 流式處理: 對於大文件,使用流式處理
  3. 內存管理: 及時釋放不需要的實例
javascript
// 好的做法
const sharp = require('sharp');
const image = sharp('input.jpg');

// 處理多個操作
await image
  .resize(300, 200)
  .jpeg({ quality: 80 })
  .toFile('output1.jpg');

await image
  .resize(150, 100)
  .png()
  .toFile('output2.jpg');

相關鏈接

基於 Apache 2.0 許可證發布