簡體   English   中英

node.js:當傳遞過多數據時,gm會引發生成E2BIG錯誤

[英]node.js: gm throws spawn E2BIG error when passed too much data

以下代碼引發錯誤:

const COUNT = 2528; // 2527 works, 2528 errors

const gm = require('gm').subClass({ imageMagick: true });

const brokenData = [];

for (let i = 0; i < COUNT; i++) {
  brokenData.push([
    Math.random() * 500, Math.random() * 500
  ]);
}

const tile = gm('./blank-tile.png')
  .resize(500, 500)
  .fill("red");

brokenData.forEach((point) => {
  tile.drawCircle(point[0], point[1], point[0] + 4, point[1]);
});

tile.write(__dirname + '/test.png', (err) => {
  if (err) {
    throw err;
  }

  console.log('success');
});

根據評論,繪制2527個圓是可以的,但會在2528個圓上引發錯誤。 每次至少在我的機器上都是一樣的。

這是錯誤:

Error: spawn E2BIG
    at ChildProcess.spawn (internal/child_process.js:358:11)
    at Object.spawn (child_process.js:533:9)
    at spawn (/Users/callumacrae/Sites/testing-gm/node_modules/cross-spawn/index.js:17:18)
    at gm._spawn (/Users/callumacrae/Sites/testing-gm/node_modules/gm/lib/command.js:224:14)
    at /Users/callumacrae/Sites/testing-gm/node_modules/gm/lib/command.js:101:12
    at series (/Users/callumacrae/Sites/testing-gm/node_modules/array-series/index.js:11:36)
    at gm._preprocess (/Users/callumacrae/Sites/testing-gm/node_modules/gm/lib/command.js:177:5)
    at gm.write (/Users/callumacrae/Sites/testing-gm/node_modules/gm/lib/command.js:99:10)
    at Object.<anonymous> (/Users/callumacrae/Sites/testing-gm/test.js:21:6)
    at Module._compile (internal/modules/cjs/loader.js:688:30)

我假設它來自gm內的某個地方,因為我沒有提供任何長參數列表!

無論我使用imagemagick還是graphicsmagick,都會發生相同的事情。 節點版本10.13.0。

有任何想法嗎?

我對node-gm並不是很熟悉,但是我有一種感覺.drawCircle(x1, y1, x2, y2)方法只是附加了一個命令行參數-draw "circle x1,y1 x2,y2" 因此,在2527年之后繪制命令將超出參數緩沖區。

使用ImageMagick,如果您有大量繪制命令,則可以寫入文件並告訴繪制命令從文件中讀取。

該文件看起來像...

# circles.txt
circle x1,y1 x2,y2
circle x1,y1 x2,y2
circle x1,y1 x2,y2
circle x1,y1 x2,y2

並使用符號( @ )前綴引用文件。

convert ... -draw @cicles.txt ...

因此,您也可以創建一個臨時文件,編寫繪圖命令,然后調用。

const tile = gm('./blank-tile.png')
  .resize(500, 500)
  .fill("red")
  .draw("@circles.txt");

但是我不確定node-gm是否支持此功能,和/或許多現代系統使用默認的安全協議禁用了MVGTXT 值得調查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM