Há mais de uma maneira de fazer processamento de imagens em Node.js, mas aqui está uma que não requer módulos adicionais:
path = require 'path'
exec = require('child_process').exec
uuid = require 'node-uuid'
exports.process = (source, callback) ->
folder = path.dirname source
guid = uuid.v4()
convertCmd = """
convert #{source} -quality 85% \\
-resize 620x465 -gravity center -background "#666" -extent 620x465 -write #{folder}/#{guid}-large.jpg \\
-resize 460x345 -write #{folder}/#{guid}-medium.jpg \\
-resize 140x105 #{folder}/#{guid}-small.jpg
"""
watermarkCmd = """
composite -dissolve 75% -gravity south \\
./resources/watermark.png #{folder}/#{guid}-large.jpg #{folder}/#{guid}-large.jpg
"""
await exec convertCmd, defer err; callback err if err
await exec watermarkCmd, defer err; callback err if err
callback null, guid
Em inglês simples, o método cria 3 versões de tamanhos diferentes de uma imagem de origem e aplica uma marca d’água na maior, simplesmente executando os utilitários de shell apropriados que vêm com o ImageMagick.
O snippet acima foi escrito em IcedCoffeeScript e foi ligeiramente adaptado de um dos meus projetos; node-uuid
é usado lá para gerar nomes exclusivos.
Você precisa ter o ImageMagick instalado corretamente; a maneira mais fácil no OS X é brew install imagemagick
.
Funciona perfeitamente no Heroku e provavelmente em outros provedores de PaaS também.