从Graphics Magic输出图像到没有base64编码的响应

时间:2016-07-07 23:26:41

标签: node.js http base64 graphicsmagick

我有一个节点服务器,我不想存储裁剪的图像,而是想要在响应AJAX调用时裁剪它们,然后将它们发送到客户端。我存储了裁剪什么以及如何在饼干和身体中裁剪的信息。在服务器上我裁剪它,在base64中编码,并将其发送回用户。这是我的代码看起来像

res.set('Content-Type', 'image/jpeg');
gm(request(body.URL))
    .crop(req.cookies[name+"Width"],req.cookies[name+"Height"],req.cookies[name+"X"],req.cookies[name+"Y"])
    .stream(function streamOut (err, stdout, stderr) {
        if (err) return next(err);
        stdout.pipe(base64encode()).pipe(res);
        stdout.on('error', next);
    });

这很有效,但我不喜欢它。我只能通过在base64中对其进行编码来实现此功能,但在客户端,将此解码为图像似乎很慢。我宁愿直接发送图片,但我无法让它工作。在不解码图像的情况下剥离图像会导致服务器发出错误的响应。有一个更好的方法吗?或者未保存的图像是否必须进行编码才能发送?

1 个答案:

答案 0 :(得分:2)

我不知道你是怎么写的node.js - 它看起来像是一堆点和圆括号给我,但是使用我对GraphicsMagick命令行的了解,我尝试了这个,它做了我认为你的事情想要 - 在stdout上写一个JPEG编码结果:

// Send header "Content-type: image/jpeg"...

var gm = require('gm');
var input  = 'input.jpg';

gm(input).resize(350).toBuffer('JPG',function (err, buffer) {
  if (err) return handle(err);
  process.stdout.write(buffer);
})

<强>更新

您是否考虑过排除AJAX方面并仅为您的图片使用静态src引用node脚本?正如我所说,我不知道nodeJavascript,但如果我通过PHP脚本生成缩略图,我会将其添加到HTML中

<img src="/php/thumb.php"/>

这样只需调用PHP脚本即可生成图像。如果您删除/php/thumb.php并将其替换为您已将上面建议的node脚本命名为,则应该告诉您问题是AJAX还是GraphicsMagick方面...... < / p>