0

以下代码引发错误:

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。

有任何想法吗?

4

1 回答 1

1

我对 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

并使用 at-symbol ( @) 前缀引用文件。

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

因此,作为替代方案,您可以创建一个临时文件,编写您的绘图命令,然后调用..

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

但是我不确定 node-gm 是否支持这一点,和/或许多现代系统使用默认安全协议禁用MVG& 。TXT值得调查。

于 2018-11-05T16:38:07.493 回答