node.js: gm 在传递过多数据时抛出 spawn 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
并引用带有 at 符号 (@
) 前缀的文件。
convert ... -draw @cicles.txt ...
因此,作为替代方案,您可以创建一个临时文件,编写绘图命令,然后调用..
const tile = gm('./blank-tile.png')
.resize(500, 500)
.fill("red")
.draw("@circles.txt");
但是我不确定 node-gm 是否支持这个,and/or 许多现代系统使用默认安全协议禁用 MVG
& TXT
。值得研究。
以下代码抛出错误:
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
并引用带有 at 符号 (@
) 前缀的文件。
convert ... -draw @cicles.txt ...
因此,作为替代方案,您可以创建一个临时文件,编写绘图命令,然后调用..
const tile = gm('./blank-tile.png')
.resize(500, 500)
.fill("red")
.draw("@circles.txt");
但是我不确定 node-gm 是否支持这个,and/or 许多现代系统使用默认安全协议禁用 MVG
& TXT
。值得研究。