Node GM (GraphicsMagick) - Генерация изображений на основе петель

Используя GM (GraphicsMagick) в NodeJS, я хотел сгенерировать некоторый контент изображения, используя циклы с такими командами, как 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 ответ

Я не знаю достаточно о gm node.js, чтобы предлагать какие-либо ответы, так что это скорее открытый комментарий, который поможет вам выбрать правильный путь.

  1. Используйте выражения FX

    Быстрее, чем ваше решение, но все же медленно, так как каждый пиксель нужно будет оценить.

    convert -size 200x200 xc:'#ddff99f3' -fx 'rand()' 'Random Noise.png'
    
  2. Сначала создайте растровое изображение.

    Это намного быстрее заполнить 1d массив 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.

Другие вопросы по тегам