我有一个节点红色流程,我从REST API获取一些图像作为png或jpg格式的二进制缓冲区。
动机:有些人不注意并将非常大的照片发布到博客服务中。由于服务的图片存储量有限,我想收听事件流,并将每张传入的图片调整为“最长边= 1024”,同时保持纵横比不变。
现在我将二进制对象作为我的流程中的缓冲区 - 但是如何在节点红色流程中调整图像大小?我搜索了半天,但没有找到能够做到这一点的节点。有什么想法吗?
答案 0 :(得分:0)
我不认为现在有一个Node-RED节点会为你做这件事。您可能必须编写自己的Node-RED节点,有关如何开始使用Node-RED doc站点here的说明。
npm上有很多ImageMagick个节点可能是一个很好的起点,或者sharp模块看起来像是另一个好的候选者。
答案 1 :(得分:0)
我最终通过将条目" jimp":#34; 0.2.x"添加到package.json依赖项并添加到settings.js中的functionGlobalContext中来公开提供jimp:
functionGlobalContext: {
mcrypto:require('crypto'),
Jimp:require('jimp')
},
现在我可以通过简单地编写:
轻松地在函数节点中使用它var JIMP = global.get("Jimp");
msg.image2 = {};
JIMP.read(msg.payload).then(function(image) {
msg.image.width = image.bitmap.width;
msg.image.height = image.bitmap.height;
if (image.bitmap.height > image.bitmap.width){
if (image.bitmap.height > 800){
image.resize(JIMP.AUTO, 800)
msg.image2.width = image.bitmap.width;
msg.image2.height = image.bitmap.height;
image.getBuffer(image.getMIME(), onBuffer);
}
}
else {
if (image.bitmap.width > 800){
image.resize(800, JIMP.AUTO)
msg.image2.width = image.bitmap.width;
msg.image2.height = image.bitmap.height;
image.getBuffer(image.getMIME(), onBuffer);
}
}
}).catch(function (err) {
// handle an exception
if (err) throw err;
});
function onBuffer (err, buffer) {
if (err) throw err;
msg.payload = buffer;
node.send(msg);
}
return ;
这样我解决了我的需要。更好的想法欢迎。