使用Node.js和GraphicsMagick拼接四幅图像

14

我有四张大小均为256x256像素的图片:a.jpg、b.jpg、c.jpg和d.jpg。我想将它们合并在一起,生成一个2x2的拼贴图像,合成后的图像也应该是256x256像素。

就像这样:

+---+---+
| 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

但问题是,如何使用Node.js内的GraphicsMagick来实现这一点呢?

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

我猜您可以从两张图像创建两张合并的图像(1 x 2),将它们旋转到左侧 90 度,然后再次合并它们(4 x 4)。当然,这不是最好的解决方案。 - Ionică Bizău
1个回答

34

找到解决方法了!看起来gm的公共API没有提供我需要的适当方法。解决方法是使用不太公开的.in方法,这样可以插入自定义的GraphicsMagick参数。

以下代码将四个256x256的图像合并成512x512画布上的2x2网格,使用快速线性插值将其减半至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);
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接