将resemble.js写入文件的缓冲区响应

我使用节点类似js来比较两个PNG图像。

比较发生没有问题,我得到了一个成功/相关的回应,但我有麻烦输出图像差异。

var express = require('express'); var fs = require('fs'); var resemble = require('node-resemble-js'); var router = express.Router(); router.get('/compare', function(req, res, next) { compareImages(res); }); var compareImages = function (res) { resemble.outputSettings({ largeImageThreshold: 0 }); var diff = resemble('1.png') .compareTo('2.png') .ignoreColors() .onComplete(function(data){ console.log(data); var png = data.getDiffImage(); fs.writeFile('diff.png', png.data, null, function (err) { if (err) { throw 'error writing file: ' + err; } console.log('file written'); }); res.render('compare'); }); }; module.exports = router; 

它按预期的方式写入diff.png,但不会创build有效的图像。

任何想法,我要去错了? 感觉就像我很接近,但只是不确定的最后一块。

谢谢

       

网上收集的解决方案 "将resemble.js写入文件的缓冲区响应"

看起来有一个pack()方法需要被调用,它做了一些工作,然后stream化数据。 在这种情况下,你可以缓冲stream,然后像这样调用writeFile:

  var png = data.getDiffImage(); var buf = new Buffer([]) var strm = png.pack() strm.on('data', function (dat) { buf = Buffer.concat([buf, dat]) }) strm.on('end', function() { fs.writeFile('diff.png', buf, null, function (err) { if (err) { throw 'error writing file: ' + err; } console.log('file written'); }) }) 

或者你可以像这样pipe道,这是一个简单的:

 png.pack().pipe(fs.createWriteStream('diff.png')) 

说实话,你的方法对我来说是有意义的(抓住Buffer并写下来),但是我认为getDiffImage返回的data Buffer并不是最终的png。 似乎文件有点薄,但这里有一些信息: https : //github.com/lksv/node-resemble.js/issues/4