2012-09-17 49 views
1

以下代碼會引發錯誤。節點gm - 使用裁剪和調整大小導致錯誤

Error: Command failed: gm convert: geometry does not contain image (unable to crop image).

var gm = require('gm'); 

gm('/origin.jpg') 
.resize(600) 
.write('/beforeCrop', function (err) { 
    // beforeCrop is 600 * 450 
    gm('/beforeCrop') 
    .crop(70, 70, 100, 100) 
    .resize(50, 50) 
    .write('/result', function (err) { 
     if (err) throw err; 
    }); 
}); 

似乎是通用汽車無法解析的beforeCrop大小。

回答

0

您似乎在讀取和寫入系統的根目錄。除非你以root /管理員身份運行,否則你將沒有適當的權限來執行該操作,如果你是這樣的話,那麼你可能(當然如果這是Web服務器的一部分的話)會造成巨大的安全漏洞。

+0

我用/只是爲了簡單。 –

+0

如何在錯誤條件下響應它們可能出現的位置,比如在你的第一個'.write'中,並且用'console.log()'這樣做來解釋錯誤發生在哪一步(在異步代碼中,一個簡單的堆棧跟蹤不會告訴你)? – ebohlman

+0

如果我保留原始圖像的擴展名,它似乎可以工作。看到我關閉[github上的問題](https://github.com/aheckmann/gm/issues/78#issuecomment-8640636)。 –

4

爲什麼不將管道連接到流並在飛行中讀取?

var gm = require('gm'); 

gm('/origin.jpg') 
.resize(600) 
.stream(function (err,stdout,stderr) { 
    // beforeCrop is 600 * 450 
    gm(stdout) // gm can read buffers ;) 
    .crop(70, 70, 100, 100) 
    .resize(50, 50) 
    .write('/result', function (err) { 
     if (err) throw err; 
    }); 
}); 

我還考慮管道到另一個流裁剪,像這樣經過:

var gm = require('gm'); 

gm('/origin.jpg') 
.resize(600) 
.stream(function (err,stdout,stderr) { 
    // beforeCrop is 600 * 450 
    gm(stdout) // gm can read buffers ;) 
    .crop(70, 70, 100, 100).stream(function (err,stdout,stderr) { 
     gm(stdout).resize(50, 50) 
     .write('/result', function (err) { 
      if (err) throw err; 
     }); 
    }); 
}); 

我在同一條鏈做既當出現了一些問題。