2016-06-12 6 views
1

私はpngjsの多くの方法で作業しています。ほとんどの場合、彼らは正常に動作します。ただし、次の例のように、私はエラーを取得:「ストリームが書き込み可能ではありません」node.js - pngjsエラー: "ストリーム書き込み不可"ランダムに

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

これはライブラリのバグだと思われますが、私はPNGの専門家ではないので、これは慎重です。ストリームがまだ書いている間、パーサーは完了したようです。これは、IENDに遭遇したので、この呼び出します:あなたはコメントアウトした場合ではなく、最終的にこの関数を呼び出すので、正しく画像を終了this.destroySoon();

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(); 
}; 

を:それ以外の場合は終わるだろう

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.writeablefalseに設定するか、またはコメントアウトするとヌル値を_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); 
関連する問題