空JPEG图像(不支持DNL)节点画布



我正在尝试使用node-canvas来裁剪背景图像,我遇到了一些奇怪的错误与以下代码。

错误是"[error: error while writing to output stream]"。如果我使用裁剪示例代码从节点画布repo我得到这个错误"空JPEG图像(不支持DNL)"

/* */
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几次没有问题,但由于某种原因,这是一个问题。如果有什么建议就太好了。

libjpeg(可能在底层使用)不支持JPEG文件中的DNL标记(请参阅本文档的最后部分,以获得解释)。包含这些标记的文件将被声明为零高度(因此Empty JPEG image消息)。我的猜测是你的输入文件使用了这样的标记,触发了一个错误。

至于解决方案:试着找到一个JPEG阅读器,它可以读取这些类型的文件,并可以将它们转换回libjpeg可以处理的东西。恐怕我不能推荐什么,因为我自己从来没有遇到过这个问题。

最新更新