2013-05-09 23 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