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
4

1 回答 1

34

找到了解决方案!似乎公共 APIgm没有为我所需要的提供任何适当的方法。解决方案是使用不那么公开的.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);
    });
于 2013-06-28T18:39:58.150 回答