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);
}パフォーマンスのヒント
- インスタンスの再利用: 可能な限り Sharp インスタンスを再利用する
- ストリーム処理: 大きなファイルにはストリーム処理を使用する
- メモリ管理: 不要なインスタンスを適時に解放する
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');