我正在通过其中的许多方法与pngjs合作。大多数时候,他们工作正常。但是,如下例所示,我收到错误:" Stream不可写"
var fs = require('fs'),
PNG = require('pngjs').PNG;
var dst = new PNG({width: 100, height: 50});
fs.createReadStream('http://1.1m.yt/hry7Eby.png') //download this picture in order to examine the code.
.pipe(new PNG())
.on('parsed', function(data) {
console.log(data);
});
这种情况不是单一的,我每天一次通过所有pngjs方法在1个随机png图像上得到此错误,并且该错误显然会导致我的应用程序崩溃。 (注意:你不能使用我给你带的readStream的http链接,你必须下载并重命名它并做类似的事情):
fs.createReadStream('1.png')
感谢您的时间和精力。
答案 0 :(得分:0)
这似乎是图书馆中的一个错误,但我担心这样说,因为我不是PNG的专家。解析器似乎在流仍在写入时完成。它遇到了IEND,因此称之为:
ParserAsync.prototype._finished = function() {
if (this.errord) {
return;
}
if (!this._inflate) {
this.emit('error', 'No Inflate block');
}
else {
// no more data to inflate
this._inflate.end();
}
this.destroySoon();
};
如果您注释掉this.destroySoon();
,它会正确完成图像,而不是最终调用此函数:
ChunkStream.prototype.end = function(data, encoding) {
if (data) {
this.write(data, encoding);
}
this.writable = false;
// already destroyed
if (!this._buffers) {
return;
}
// enqueue or handle end
if (this._buffers.length === 0) {
this._end();
}
else {
this._buffers.push(null);
this._process();
}
};
...否则最终会将stream.writeable
设置为false
,或者,如果您对此进行评论,则将空值推送到_buffers
数组并拧紧ChunkStream._processRead
。
我非常确定这是zlib解析器完成时间和流完成所需时间之间的同步性问题,因为如果你同步执行此操作就可以正常工作:
var data = fs.readFileSync('pic.png');
var png = PNG.sync.read(data);
var buff = PNG.sync.write(png);
fs.writeFileSync('out2.png', buff);