4

我正在使用node-resemble-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 但是它没有创建有效的图像。

有什么想法我哪里出错了吗?感觉我已经很接近了,但不确定最后一块。

谢谢

4

1 回答 1

3

看起来有一个 pack() 方法需要被调用,它做了一些工作,然后流化数据。在这种情况下,您可以缓冲流,然后像这样调用 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');
          })
        })

或者你可以像这样管道它,这更简单一点:

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

老实说,你的方法对我来说是有意义的(抓住缓冲区并写下来),但我猜data附加到返回的缓冲区getDiffImage并不是最终的 png。似乎文档有点薄,但这里有一些信息:https ://github.com/lksv/node-resemble.js/issues/4

于 2015-02-26T20:43:32.963 回答