Node.jsで画像の大きさを取得:image-sizeとsharpパッケージ徹底比較
Node.jsで画像の幅と高さを取得する方法
image-size
パッケージは、画像ファイルの幅と高さを取得するためのライブラリです。使い方はとても簡単で、以下の手順で画像の幅と高さを取得できます。
const imageSize = require('image-size');
const imagePath = 'path/to/image.jpg';
(async () => {
const dimensions = await imageSize(imagePath);
console.log(dimensions.width); // 幅を出力
console.log(dimensions.height); // 高さを出力
})();
sharp
パッケージは、画像処理用のライブラリです。画像の幅と高さを取得する以外にも、リサイズ、フォーマット変換、フィルタ処理など、様々な画像処理を行うことができます。
const sharp = require('sharp');
const imagePath = 'path/to/image.jpg';
sharp(imagePath)
.metadata()
.then(metadata => {
console.log(metadata.width); // 幅を出力
console.log(metadata.height); // 高さを出力
});
どちらのパッケージを使うべき?
- シンプルに画像の幅と高さを取得したいだけなら、
image-size
パッケージの方が軽量で使いやすいです。 - 画像処理的其他の処理も行いたい場合は、
sharp
パッケージの方が機能が豊富なのでおすすめです。
- 上記以外にも、
jimp
やexif-parser
などのライブラリを使って画像の幅と高さを取得することができます。 - 画像の幅と高さを取得する以外にも、画像の形式やMIMEタイプなどの情報も取得できます。
Node.jsで画像の幅と高さを取得するサンプルコード
image-sizeパッケージを使う
const imageSize = require('image-size');
const imagePath = 'path/to/image.jpg';
(async () => {
const dimensions = await imageSize(imagePath);
console.log(dimensions.width); // 幅を出力
console.log(dimensions.height); // 高さを出力
})();
説明:
image-size
パッケージをインポートします。- 画像のパスを
imagePath
変数に格納します。 await imageSize(imagePath)
で画像の幅と高さを取得します。- 取得した幅と高さをコンソールに出力します。
sharpパッケージを使う
const sharp = require('sharp');
const imagePath = 'path/to/image.jpg';
sharp(imagePath)
.metadata()
.then(metadata => {
console.log(metadata.width); // 幅を出力
console.log(metadata.height); // 高さを出力
});
sharp(imagePath).metadata()
で画像のメタデータを取得します。then
メソッドでメタデータ取得の完了処理を定義します。
補足
- 上記のコードはあくまで一例です。実際の使用環境に合わせて適宜変更してください。
- エラー処理などは省略しています。本番環境で使用する場合は、適切なエラー処理を実装してください。
Node.jsで画像の幅と高さを取得するその他の方法
fsモジュールとBuffer.from()関数を使う
この方法は、Node.jsの標準ライブラリのみを使用して画像の幅と高さを取得する方法です。
const fs = require('fs');
const imagePath = 'path/to/image.jpg';
fs.readFile(imagePath, (err, buffer) => {
if (err) {
console.error(err);
return;
}
const dimensions = getDimensionsFromBuffer(buffer);
console.log(dimensions.width);
console.log(dimensions.height);
});
function getDimensionsFromBuffer(buffer) {
const magicNumber = buffer.slice(0, 3);
if (magicNumber === 'JPE') {
// JPEG画像の場合
const width = buffer.readUInt16BE(18);
const height = buffer.readUInt16BE(20);
return { width, height };
} else if (magicNumber === 'PNG') {
// PNG画像の場合
const width = buffer.readUInt32BE(16);
const height = buffer.readUInt32BE(20);
return { width, height };
} else {
// その他の画像形式の場合
console.error('Unsupported image format');
return { width: 0, height: 0 };
}
}
fs.readFile(imagePath, callback)
で画像ファイルを読み込みます。callback
関数内で、読み込んだ画像データのbuffer
変数から画像の幅と高さを取得します。getDimensionsFromBuffer
関数を使用して、buffer
変数から画像の形式と幅と高さを取得します。
exif-parser
パッケージは、画像ファイルのEXIF情報から幅と高さを取得することができます。EXIF情報は、デジタルカメラで撮影された画像に格納されている画像に関する情報です。
const exifParser = require('exif-parser');
const imagePath = 'path/to/image.jpg';
(async () => {
const image = await exifParser.parseFile(imagePath);
const { width, height } = image.image.ImageSize;
console.log(width); // 幅を出力
console.log(height); // 高さを出力
})();
await exifParser.parseFile(imagePath)
で画像ファイルのEXIF情報を読み込みます。- 読み込んだEXIF情報から
image.image.ImageSize
プロパティで幅と高さを取得します。
上記の方法のメリットとデメリット
- fsモジュールとBuffer.from()関数を使う方法:
- メリット: 標準ライブラリのみで実装できるため、外部ライブラリのインストールが不要です。
- デメリット: 画像形式によっては正しく動作しない場合があります。
- exif-parserパッケージを使う方法:
- メリット: EXIF情報から幅と高さを取得できるため、画像形式に依存せずに動作します。
- デメリット: 外部ライブラリのインストールが必要となります。
Node.jsで画像の幅と高さを取得するには、様々な方法があります。それぞれメリットとデメリットがあるので、状況に合わせて最適な方法を選択してください。
node.js