合并2个图像与node.js?

我想要使​​用node.js合并2个图像。 或者说,我想在较大的图像上放置一个更小的图像在坐标x,y上。 更确切地说:我有一副眼镜的形象,一张脸的形象,我想把眼镜放在脸上。 我做了一些Googlesearch,并发现了一些图像操作库,但似乎没有能够合并图像。

我用过:

https://github.com/learnboost/node-canvas

做类似的事情(即时从组件创build一个复合图像)。

它工作很好。

以下是一些示例代码:

var Canvas = require('canvas'), fs = require('fs'), Image = Canvas.Image; var _components = [{prefix:'f', count:12}, {prefix:'h', count:12}, {prefix:'i', count:12}, {prefix:'m', count:12}]; var _total = 1; for (var i=_components.length - 1; i>=0; i--){ _components[i].mult = _total; _total *= _components[i].count; } module.exports.ensureImageExists = function(img, cb){ fs.stat(__dirname + '/../public/images/rb/' + img, function(err, stats){ if (err){ if (err.code == 'ENOENT') generateImage(img, cb); else cb(err); } else{ cb(); } }); } function generateImage(name, cb){ var re = /rb([0-9]*)\.png/ var num = parseInt(re.exec(name)[1]) % _total; var parts = []; for (var i=0; i<_components.length; i++){ var n = Math.floor(num / _components[i].mult); parts.push(_components[i].prefix + (n + 1)); num -= n * _components[i].mult; } var canvas = new Canvas(45, 45), ctx = canvas.getContext('2d'); drawParts(); function drawParts(){ var part = parts.shift(); if (!part) saveCanvas(); else { var img = new Image; img.onload = function(){ ctx.drawImage(img, 0, 0, 45, 45); drawParts(); }; img.src = __dirname + '/components/' + part + '.png'; } } function saveCanvas(){ canvas.toBuffer(function(err, buf){ if (err) cb(err); else fs.writeFile(__dirname + '/../public/images/rb/' + name, buf, function(){ cb(); }); }); } } 

在这种情况下,组件是根据图像的名称来select的,但是您明显可以做到这一点。 另外,我想如果你愿意的话,你可以把图像stream出来 – 我把它写入一个文件,以便在下一次请求时可用。

我把这样一条路线放在处理这一代:

 app.get('/images/rb/:img', requireLogin, function(req, res, next){ //first make sure image exists, then pass along so it is handled //by the static router rbgen.ensureImageExists(req.params.img, function(err){ next(); }) }); 

你可能需要这个: https : //github.com/zhangyuanwei/node-images

用于Nodejs的跨平台图像解码器(png / jpeg / gif)和编码器(png / jpeg)

 images("big.jpg").draw(images("small.jpg"), 10, 10).save("output.jpg");