Lambda での画像変換時にカラープロファイルを追加する
渡辺です。
画像ファイルのリサイズは、AWS Lambdaの活用パターンとしてよく知られています。 オリジナル画像のS3アップロードイベントでLambdaを呼び出し、適切なサイズに変換して公開用S3バケットにアップロードする流れです。 本日は、この画像変換処理で、カラープロファイルを適用する方法を紹介します。
カラープロファイルとは?
実は、同じ画像データでも、表示するディスプレイなどによって見え方、特に色合いが変わってきます。 カラープロファイルを適用すると、このような環境毎の色合いの差異を少なくできます。 画像ファイルでは、ICC形式のファイルを埋め込むことで、各環境で適用されます。
GraphicsMagickでプロファイルを適用する
GraphicsMagick for node.js を利用してプロファイルを画像ファイルに追加するには、次のようにprofileメソッドを利用します。
var gm = require('gm'); var img = gm(original) .resize(width, height) .quality(quality); .profile(colorProfile) # プロファイルの埋め込み .toBuffer(imageType, function (err, buffer) { if (err) { callback(err, key); } else { s3.putObject({ Bucket: bucket, Key: key, Body: buffer, ContentType: contentType }, function (err) { console.log("done: " + key); callback(err, key); }); } });
colorProfileにはプロファイルへのファイルパスを指定します。
Lambdaでは、/tmp
ディレクトリにローカルファイルを配置できます。
例えば、S3などにカラープロファイルをアップロードし、/tmp
ディレクトリにダウンロードして利用することができるでしょう。
とはいえ、Lambdaのコードと一緒にアップロードしたいところです。
LAMBDA_TASK_ROOTで展開先のパスを取得する
Lambdaの環境変数サポートにより、幾つかの環境変数が利用できるようになりました。
そのひとつが、Lambdaのコードが展開されているパスを参照するLAMBDA_TASK_ROOT
です。
アップロードするLambda関数と一緒にカラープロファイルを含めれば、次のようにカラープロファイルのパスを指定できます。
var colorProfile = process.env.LAMBDA_TASK_ROOT + "/sample.icc";
相対パスで指定できるかもしれませんが、絶対パスで指定する方が間違いはないでしょう。
まとめ
Lambda関数で固定のリソースファイルなどを参照する場合、そのファイルも含めてzipファイルを作成してください。
ファイルへ参照には、環境変数LAMBDA_TASK_ROOT
を利用し、絶対パスで指定すればファイルの読み込みが可能でしょう。
ただし、一時ファイルなどを書き出す場合は、/tmp
を利用してください。