2013-06-28 1 views
13

4 개의 256x256 픽셀 이미지 (a.jpg, b.jpg, c.jpg 및 d.jpg)가 있습니다. 2x2 모자이크 이미지를 만들기 위해 이들을 병합하고 싶습니다. 결과 이미지도 256x256 픽셀이어야합니다. 이처럼Node.js 및 GraphicsMagick을 사용하여 4 개의 이미지를 함께 바둑판 식으로 배열하십시오.

:

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

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 및 명령 줄을 사용하지만 문제는, 어떻게하는 것입니다이 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

두 이미지를 병합하여 왼쪽에서 90도 회전 한 다음 다시 병합 (4 x 4) 할 수 있습니다. 물론, 그것은 최선의 해결책이 아닙니다. –

답변

30

해결책을 찾았습니다! gm의 공용 API는 필자가 필요로하는 적절한 방법을 제공하지 않는 것 같습니다. 해결책은 비공개 .in 메서드를 사용하여 사용자 지정 GraphicsMagick 인수를 삽입하는 것이 었습니다.

다음 코드는 4 개의 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); 
    });