Node.js 从Graphics Magic到响应的管道图像输出,无需base64编码

Node.js 从Graphics Magic到响应的管道图像输出,无需base64编码,node.js,http,base64,graphicsmagick,Node.js,Http,Base64,Graphicsmagick,我有一个节点服务器,在这里,我不想存储裁剪后的图像,而是想根据AJAX调用裁剪它们,并以这种方式将它们发送到客户端。我正在存储要裁剪的内容以及如何在Cookie和body中裁剪的信息。在服务器上,我裁剪它,用base64编码,然后将其发送回用户。下面是我的代码 res.set('Content-Type', 'image/jpeg'); gm(request(body.URL)) .crop(req.cookies[name+"Width"],req.cookies[name+"Heig

我有一个节点服务器,在这里,我不想存储裁剪后的图像,而是想根据AJAX调用裁剪它们,并以这种方式将它们发送到客户端。我正在存储要裁剪的内容以及如何在Cookie和body中裁剪的信息。在服务器上,我裁剪它,用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中编码来实现这一点,但在客户端,将其解码为图像似乎很慢。我宁愿直接发送一个图像,但我无法让它工作。在不解码的情况下对图像进行Piping操作会导致服务器发出胡言乱语的响应。有更好的方法吗?或者未保存的图像必须进行编码才能发送?

我不知道如何编写
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
?正如我所说,我不知道
节点
Javascript
,但如果我通过PHP脚本生成缩略图,我会将其添加到HTML中

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


这样就调用了一个PHP脚本来生成一个图像。如果删除
/php/thumb.php
并将其替换为我上面建议的
节点
脚本,它应该会告诉您问题是AJAX还是
GraphicsMagick
方面…

您在
之前是否尝试过
.setFormat('jpg')
?setFormat('jpg'))导致了和我之前一样的胡言乱语。我不熟悉fs.createWriteStream,你能告诉我在我的代码中会是什么样子吗?我回家后会试试看。在收到服务器的响应后,是否需要执行任何特殊操作才能将其显示在页面上?例如,目前我只是让AJAX回调使用“data:image/jpeg;base64”+response”编辑src属性以显示它。至于我的格式设置,我将每个方法拆分为一行,以便“crop”与“stream”分开。除此之外,它看起来很难看,因为我使用了多个中间件,“crop”方法的参数都来自cookies,我可以通过将它们存储在一个具有更有用名称的变量中来进行一些清理。在发布之前,我没有费心这么做,因为理解这一部分与回答问题无关。我不这么认为,但我从来没有做过任何
node.js
,通常我会让一个HTML
img
元素将
src
设置为PHP脚本的名称,它会改变图像并返回一个“内容类型:图像/jpeg“然后是数据,所以我猜上面的代码将相当于大致相同的东西,并有望工作。我将上面的内容放在一个名为
script.js
的脚本中,然后运行
node script.js>result.jpg
对它进行了测试,图像是正确的,所以我很高兴脚本在其
stdout
上写了一个JPEG。这看起来很有希望。在下班回家之前我无法尝试,但我会让你知道发生了什么。你的解决方案工作到了我能够将其写入文件的程度,但我仍然无法找到将其流回到用户的方法。