Подтвердить что ты не робот

Сложите четыре изображения вместе с помощью Node.js и GraphicsMagick

У меня есть четыре изображения размером 256x256 пикселей: a.jpg, b.jpg, c.jpg и d.jpg. Я хотел бы объединить их вместе, чтобы создать изображение 2x2 мозаики. Полученное изображение должно быть также 256x256 px.

Вот так:

+---+---+
| a | b |
+---+---+
| c | d |
+---+---+

Использование простой GraphicsMagick и командной строки это можно сделать с помощью

gm convert -background black \
    -page +0+0      a.jpg \
    -page +256+0    b.jpg \
    -page +0+256    c.jpg \
    -page +256+256  d.jpg \
    -minify \
    -mosaic output.jpg

Но проблема в том, как это сделать, используя GraphicsMagick в Node.js?

gm('a.jpg')
    .append('b.jpg')
    .append('c.jpg')
    .append('d.jpg')
    .write('output.jpg', function (err) {})
// Produces 1x4 mosaic with dimensions 256x1024 px, not what I wanted
4b9b3361

Ответ 1

Нашел решение! Похоже, что публичный API gm не предоставляет правильных методов для того, что мне нужно. Решение заключалось в использовании не-общедоступного метода .in, который позволяет вставлять собственные аргументы GraphicsMagick.

Следующий код содержит четыре изображения 256x256, объединяет их с сеткой 2x2 на холсте 512x512, уменьшает размер до 256x256 с использованием быстрой линейной интерполяции и сохраняет результат на output.jpg.

var gm = require('gm');

// a b c d  ->  ab
//              cd
gm()
    .in('-page', '+0+0')  // Custom place for each of the images
    .in('a.jpg')
    .in('-page', '+256+0')
    .in('b.jpg')
    .in('-page', '+0+256')
    .in('c.jpg')
    .in('-page', '+256+256')
    .in('d.jpg')
    .minify()  // Halves the size, 512x512 -> 256x256
    .mosaic()  // Merges the images as a matrix
    .write('output.jpg', function (err) {
        if (err) console.log(err);
    });