DEV Community

おdd
おdd

Posted on

node-imagemagickの使い方(日本語)

はじめに

Lambdaで画像のサムネイルを作る [Stream yields empty buffer対策済] by @hkomachi on @Qiita

上記の記事を参考に,AWS Lambdaを使って動的画像リサイズを行おうとした際,もうちょっと細かいことをしようとして https://github.com/rsms/node-imagemagick の README読んでもわからなくて,結局慣れない中モジュールのコードを全部読んでしまったのでメモ。

メソッド紹介

メソッド(の一部)紹介。
上記リポジトリのREADMEの一部和訳と補足。

identify(args, callback(err, output))

imagemagick のidentifyコマンドと同様に画像の詳細を得る。
argsにはidentifyコマンドの引数をそのまま入力することが可能。
identify | ImageMagick コマンドリファレンス

im.identify(['-format', '%wx%h', 'kittens.jpg'], function(err, output){
  if (err) throw err;
  console.log('dimension: '+output);
  // dimension: 3904x2622
});
Enter fullscreen mode Exit fullscreen mode

ファイル名ではなく画像データを直接入れることも可能。
例えば,aws.s3でs3バケットからオブジェクトをとってきた(ファイルパスを指定するのが難しい)ときは,

s3.getObject(params, (err, data) => {
    if (err) {
    } else {
        im.identify(['-format', '%w', {data: data.Body}], function(err, output){
            if (err) throw err;
            console.log('dimension: '+output);
            // dimension: 3904x2622
        });
    }
});
Enter fullscreen mode Exit fullscreen mode

といったようにできる。

readMetadata(path, callback(err, metadata))

identifyコマンドを使うが,こっちは結果がmetadataオブジェクトとして帰ってくる。

convert(args, callback(err, stdout, stderr))

convertコマンドを使う。これもargsは引数そのまま。
convert | ImageMagick コマンドリファレンス

resize(options, callback(err, stdout, stderr))

convertコマンドのresize機能を使う。第一引数optionsの内容例を示す。

{
  srcPath: 'hoge.jpg', // 元画像パス srcDataと排他
  srcData: null,      // 元画像データ srcPathと排他
  quality: 0.8,
  format: 'jpg',      // 出力フォーマット
  width: 0,           // 出力横幅
  height: 0,          // 出力高さ
  customArgs: []      // 自由にオプションを追加できる
}
Enter fullscreen mode Exit fullscreen mode

サイズ指定のあとに><を使って「指定サイズより(大き|小さ)ければ(縮小|拡大)」みたいなのができない。
一通りコード読んで,リサイズするにしても細かいことがしたければresizeではなくconvertを使ったほうがよいという結論に至った。

crop(options, callback)

resizeと同様convertコマンドのcrop機能を使う。
これも細かくオプションを弄りたければconvert関数のほうを使う必要がある。

さいごに

完璧なラッパーなど存在しない 😢

Top comments (0)