2016-11-15 20 views
1

Для двух изображений, скажем, в папке img (размером 1024x768) (img1.png и img2.png), мне нужно изменить размер img2 (скажем, 300x300) и надеть img1 в x и y (скажем, 100, 200) вверху слева от img1. Конечный результат должен быть размером 1024x768.Измените размер и составьте два или более изображений, используя gm в Nodejs

Использование ГМ (https://github.com/aheckmann/gm), попытался это:

gm('./img/img1.png') 
.composite('./img/img2.png') 
.geometry('300x300+100+200') 
.write('resultGM.png', (err) => { 
    if (err) console.log(err); 
}); 

ожидаемо (из-за цепи на всей операции) она производит 300x300 изображение. Тогда я попытался это:

gm('./img/img1.png') 
.composite(
    gm('./img/img2.png') 
    .geometry('300x300+100+200') 
) 
.write('resultGM.png', (err) => { 
    if (err) console.log(err); 
}); 

надеясь композитная функция принимает буфер, но не случайно, он не только принимает путь к файлу, и он дает ошибку. Проведя 2-3 часа и прочитав несколько сообщений (здесь можно было найти несколько дискуссий: How to do composite with gm node.js? и здесь: Combine two gm objects while resizing one of them in graphicsMagick for NodeJS (на самом деле это не отвечает на вопрос), я не смог найти решение для этой операции в памяти, используя потоки или буфер.Возможно делать это во время записи во временный файл. Есть ли там какой-нибудь орган, который мог бы найти решение для изменения размера и объединить изображения на лету?

ответ

1

Использование ImageMagick вместо GraphicMagic;

После нескольких часов поиска, наконец, я выяснил, как объединить два изображения, изменяя размер и переупорядочивая позиции слоя (над, под и т. Д.) С помощью gm.

Давайте посмотрим этот образ первого:

enter image description here

Через несколько минут выкапывать страницу помощи ImageMagick создания сообщения, я увидел, использование DstOver позиционирования.

http://www.imagemagick.org/Usage/compose/#dstover

Итак, я попробовал этот код, приведенный ниже, и он работал как шарм!

imageMagick(background) 
    .composite(image) 
    .in('-compose', 'Dst_Over') 
    .in('-geometry', '253x253+15+15') 
    .write(output, function (err) { 
    if (err) console.error(err); 
     else console.log('Compose OK!'); 
    }); 
+0

Кстати, для компоновки изображений холст-узел действительно неплох и быстрее, чем gm или im. –

+0

Еще не пробовал, но. Я позабочусь о том, чтобы закончить мой текущий проект. Тем не менее вам нужно установить пакеты, как я видел. Холст идеально подходит для выравнивания - позиционирования объектов. Благодарим за ваше предложение. –

+0

да, это требует cairo и pango –

0

Наконец-то я мог это сделать, здесь я публикую для справки для тех, кто может понадобиться:

gm() 
.in('-geometry', '+0+0') 
.in('./img/img1.png') 
.in('-geometry', '300x300+100+200') 
.in('./img/img2.png') 
.flatten() 
.write('resultGM.png', function (err) { 
    if (err) console.log(err); 
}); 
+0

Этот способ не работает для меня. Я установил ImageMagick, поэтому будет использовать imagemagick вместо graphicmagic. См. Мой ответ. –