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

Jov*_*yne 6 canvas node.js

我正在尝试使用节点画布裁剪背景图像,但在以下代码中遇到了一些奇怪的错误。

错误是“[错误:写入输出流时出错]”。如果我使用节点画布存储库中的裁剪示例代码,我会收到此错误“空 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);

        });
      }
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

我已经多次使用节点画布,没有任何问题,但由于某种原因这是一个问题。任何建议都会很棒。

rob*_*lep 6

libjpeg(可能在幕后使用)不支持 JPEG 文件中的 DNL 标记(请参阅本文档最后部分的说明)。包含此类标记的文件将声明高度为零(因此出现该Empty JPEG image消息)。我的猜测是您的输入文件使用此类标记,从而触发错误。

至于解决方案:尝试找到一个 JPEG 阅读器,它可以读取这些类型的文件,并将它们转换回 libjpeg 可以处理的文件。恐怕我无法推荐任何东西,因为我自己从未遇到过这个问题。

  • 感谢您的回复。这就是我一开始的想法,但经过一番摆弄后,结果证明是我的问题。在我初始化画布实例的那一行中,宽度和高度是从查询字符串设置的,并且仍然被解析为字符串,因此画布可能被初始化为 0,0 宽度和高度。一旦我使用了正确的数字/ int,现在一切正常。一些更好的错误处理或类型转换可能会有所帮助。我会建议节点画布团队回购。var cnv = new Canvas(w,h); (2认同)