在NodeJS中使用GM(GraphicsMagick),我想通过使用带有drawPoint等命令的循环来设置像素数据来生成一些图像内容,但是我不确定这样做的最佳实践。
我用循环测试过的代码可以工作,但是它很慢,因为每次设置像素时都会加载并保存图像。
这是我的测试,会产生随机的rgb噪声。如何临时存储通过循环设置的图像数据,然后仅在完成后保存?
var fs = require('fs');
var gm = require('gm').subClass({imageMagick: true});
var w = 200;
var h = 200;
gm(200, 200, '#ddff99f3').write('./Random Noise.png', function (err) {});
var row = 0;
var col = 0;
var r = 0;
var g = 0;
var b = 0;
function rgb(r, g, b){
r = Math.floor(r);
g = Math.floor(g);
b = Math.floor(b);
return ['rgb(',r,',',g,',',b,')'].join('');
}
for (row = 0; row < h; row++){
for (col = 0; col < w; col++){
r = Math.floor((Math.random() * 255) + 1);
g = Math.floor((Math.random() * 255) + 1);
b = Math.floor((Math.random() * 255) + 1);
gm('./Random Noise.png')
.fill(rgb(r,g,b))
.drawPoint(col, row)
.write('./Random Noise.png', function (err) {});
}
}
答案 0 :(得分:0)
我对node.js的gm知之甚少,因此无法提供任何答案,因此,这更多是一个公开的评论,以使您走上正确的道路。
解决方案要快,但仍然很慢,因为需要评估每个像素。
convert -size 200x200 xc:'#ddff99f3' -fx 'rand()' 'Random Noise.png'
首先构建光栅图像。
以更快的方式填充一维8位值数组,然后直接将其导入。再次,您必须检出node-gm文档以查看它们如何导入/导出数据。
var raster = [],
index = 0;
for (row = 0; row < h; row++){
for (col = 0; col < w; col++) {
raster[index++] = Math.floor((Math.random() * 255) + 1) // RED
raster[index++] = Math.floor((Math.random() * 255) + 1) // GREEN
raster[index++] = Math.floor((Math.random() * 255) + 1) // BLUE
}
}
导入此命令的CLI命令类似于...
cat raster.dat | convert -size 200x200 -depth 8 rgb:- 'Random Noise.png'
我想文档会把上面的称为“流”和“管道”。
希望其他人能够提供node-gm示例。