2013-05-09 73 views
1

我想使用节点画布来裁剪背景图像,我遇到了一些奇怪的错误,下面的代码。空的JPEG图像(DNL不支持)node-canvas

错误是“[错误:写入输出流时出错]”。如果我从节点帆布回购使用裁剪示例代码我得到这个错误“空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); 

     }); 
     } 
    }); 
    } 
}); 

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

回答

3

libjpeg(可能在引擎盖下使用)不支持JPEG文件中的DNL标记(see this document, towards the end, for an explanation)。包含这些标记的文件将声明为零高度(因此为Empty JPEG image消息)。我的猜测是你的输入文件使用这样的标记,引发错误。

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

+1

感谢您的回复。多数民众赞成在我最初的想法,但经过一些摆弄后,它竟然是我的问题。 在我初始化画布实例的行中,宽度和高度是从查询字符串中设置的,并且仍然被解析为字符串,因此画布可能已用0,0宽度和高度初始化。一旦我使用适当的数字/整数现在一切正常。更好的错误处理或类型转换可能会有所帮助。我会建议到节点帆布队的回购。 var cnv = new Canvas(w,h); – 2013-05-09 20:32:24

+0

您是否错误地生成了0高度的JPEG?这可能会触发相同的消息,我想:) – robertklep 2013-05-09 20:33:49

+0

雅这就是它是什么。 – 2013-05-09 20:36:20