Node GM(GraphicsMagick)-基于循环的图像生成

时间:2018-08-05 09:57:07

标签: node.js loops imagemagick gm

在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) {});
    }
}

1 个答案:

答案 0 :(得分:0)

我对node.js的gm知之甚少,因此无法提供任何答案,因此,这更多是一个公开的评论,以使您走上正确的道路。

  1. 使用FX expressions

    解决方案要快,但仍然很慢,因为需要评估每个像素。

    convert -size 200x200 xc:'#ddff99f3' -fx 'rand()' 'Random Noise.png'
    
  2. 首先构建光栅图像。

    以更快的方式填充一维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示例。