Lambda での画像変換時にカラープロファイルを追加する

AmazonLambda

渡辺です。

画像ファイルのリサイズは、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を利用してください。