Node.jsで画像の大きさを取得:image-sizeとsharpパッケージ徹底比較

2024-07-02

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パッケージの方が機能が豊富なのでおすすめです。
  • 上記以外にも、jimpexif-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); // 高さを出力
    })();
    

    説明:

    1. image-sizeパッケージをインポートします。
    2. 画像のパスをimagePath変数に格納します。
    3. await imageSize(imagePath)で画像の幅と高さを取得します。
    4. 取得した幅と高さをコンソールに出力します。

    sharpパッケージを使う

    const sharp = require('sharp');
    
    const imagePath = 'path/to/image.jpg';
    
    sharp(imagePath)
      .metadata()
      .then(metadata => {
        console.log(metadata.width); // 幅を出力
        console.log(metadata.height); // 高さを出力
      });
    
    1. sharp(imagePath).metadata()で画像のメタデータを取得します。
    2. 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 };
      }
    }
    
    1. fs.readFile(imagePath, callback)で画像ファイルを読み込みます。
    2. callback関数内で、読み込んだ画像データのbuffer変数から画像の幅と高さを取得します。
    3. 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); // 高さを出力
    })();
    
    1. await exifParser.parseFile(imagePath)で画像ファイルのEXIF情報を読み込みます。
    2. 読み込んだEXIF情報からimage.image.ImageSizeプロパティで幅と高さを取得します。

    上記の方法のメリットとデメリット

    • fsモジュールとBuffer.from()関数を使う方法:
      • メリット: 標準ライブラリのみで実装できるため、外部ライブラリのインストールが不要です。
      • デメリット: 画像形式によっては正しく動作しない場合があります。
    • exif-parserパッケージを使う方法:
      • メリット: EXIF情報から幅と高さを取得できるため、画像形式に依存せずに動作します。
      • デメリット: 外部ライブラリのインストールが必要となります。

    Node.jsで画像の幅と高さを取得するには、様々な方法があります。それぞれメリットとデメリットがあるので、状況に合わせて最適な方法を選択してください。


      node.js


      Node.jsでファイル/ディレクトリが存在するかどうかを非同期的に確認する方法

      まず、fsモジュールを読み込みます。existsSync()メソッドは、ファイルパスを受け取り、そのファイルが存在するかどうかを同期的に確認します。上記のコードは、./my-file. txtファイルが存在するかどうかを確認します。ファイルが存在する場合は、ファイルが存在しますと出力し、存在しない場合は、ファイルが存在しませんと出力します。...


      PM2、Docker、Cloud Run:ApacheとNode.jsを同じサーバーで実行するその他の方法

      それぞれの特徴Apache: 静的コンテンツ(HTML、CSS、JavaScriptなど)の配信に特化したWebサーバーです。長年安定稼働しており、設定も比較的簡単です。Node. js: JavaScriptを用いてサーバーサイドの処理を行うプラットフォームです。リアルタイム通信や非同期処理などに適しており、近年注目されています。...


      node.js初心者でも安心!npm linkでインストールしたパッケージを簡単にアンインストールする方法

      npm link でインストールしたパッケージをアンインストールするには、以下の2つの方法があります。npm-unlink コマンドは、npm link で作成されたシンボリックリンクを削除するために使用されます。以下のコマンドを実行して、npm link でインストールしたパッケージをアンインストールします。...


      「Server Discovery And Monitoring engine is deprecated」エラーのその他の解決方法

      「Server Discovery And Monitoring engine is deprecated」というエラーは、MongoDBとの接続において、古い接続方法が非推奨となり、将来のバージョンで削除されることを示します。これは、JavaScript、Node...


      Webpack 5 で Node.js 環境を再現する:ポリフィルによる Node コアモジュールの動作確認

      Node. js は、JavaScript をサーバーサイドで実行するためのプラットフォームです。Node コアモジュールは、Node. js に標準で付属するモジュール群です。一方、Webpack は、JavaScript モジュールをバンドルするためのツールです。...