6

node-canvas を使用して背景画像をトリミングしようとしていますが、次のコードで奇妙なエラーが発生しています。

エラーは「[エラー: 出力ストリームへの書き込み中にエラーが発生しました]」です。node-canvas リポジトリのクロップ サンプル コードを使用すると、「Empty JPEG image (DNL not supported)」というエラーが表示されます。

/* */
var cnv = new Canvas(w,h),
    ctx = cnv.getContext('2d'),
    original  = '/img/pages/'+page+'/background.jpg';


ctx.imageSmoothingEnabled = true;



fs.readFile('public/'+original, function( err,image){
  if (err) {
    res.status(404)
        .send('Not found');
  }
  else {
    var 
    img     = new Image;
    img.src = image;


    ctx.drawImage(img, 
      Math.abs( (w-img.width)/2),0,
      w,h,
      0,0,
      w,h
    );


    cnv.toBuffer(function(err, buf){

      console.log(err);

      if( err){
        res.status(500)
            .send('Error generating image buffer');
      }
      else {
        fs.writeFile('public'+resampled, buf, function(err){

          console.log(err);
          console.log('Resized and saved in %dms', new Date - start);

          returnResampledFile( res,page,w,h);

        });
      }
    });
  }
});

問題なく node-canvas を数回使用しましたが、何らかの理由でこれが問題です。どんな提案も素晴らしいでしょう。

4

1 に答える 1

6

libjpeg(おそらく内部で使用されている) は、JPEG ファイルの DNL マーカーをサポートしていません (説明については、このドキュメントの最後を参照してください)。そのようなマーカーを含むファイルは、高さがゼロであると宣言します (したがって、Empty JPEG imageメッセージ)。私の推測では、入力ファイルでそのようなマーカーが使用されているため、エラーが発生します。

解決策については、これらの種類のファイルを読み取り、libjpeg が処理できる形式に変換できる JPEG リーダーを探してみてください。自分でこの問題に遭遇したことがないので、何もお勧めできません。

于 2013-05-09T20:28:04.130 に答える