2013-06-28 66 views
13

我有四個256x256 px圖像:a.jpg,b.jpg,c.jpg和d.jpg。我想將它們合併在一起產生2x2馬賽克圖像。生成的圖像也應該是256x256像素。使用Node.js和GraphicsMagick將四個圖像拼接在一起

像這樣:

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

我想你可以創建從兩個圖像(1 x 2)合併兩個圖像旋轉到90度左,然後再合併它們(4 x 4)。當然,這不是最好的解決方案。 –

回答

30

找到解決方案!看來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); 
    });