2013-08-27 25 views
13

Jak zrobić "gm composite -grawitacja change_image_url base_image_url" z GM Node.js?Jak zrobić composite with gm node.js?

Jak uzyskać połączenie gm().command() & gm().in() lub gm().out() w celu osiągnięcia powyższego?

+0

byłeś w stanie zorientować się, jak przejść w adresach URL, aby uzyskać kompozyt do pracy? Czytam, że można tylko przekazywać ścieżki plików. – NateW

Odpowiedz

3

robię to w ten sposób:

var exec = require('child_process').exec 
var command = [ 
     '-composite', 
     '-watermark', '20x50', 
     '-gravity', 'center', 
     '-quality', 100, 
     'images/watermark.png', 
     'images/input.jpg', //input 
     'images/watermarked.png' //output 
     ]; 
     // making watermark through exec - child_process 
     exec(command.join(' '), function(err, stdout, stderr) { 
      if (err) console.log(err); 

     }); 
+2

jako aktywny opiekun gm, sugeruję, że robisz to w ten sposób ... ponieważ gm jest prawie niepotrzebny. jedyną różnicą jest to, że użyłbym 'execFile' zamiast' exec'. –

+0

również, upewnij się, że polecenie zaczyna się od 'gm composite' –

+2

w tym przykładzie, gdzie gm jest nawet używany? ... @ Jonathan mógłbyś powiedzieć więcej, gdzie użyć gm. jak to 'exec ('gm composite' + command.join ('') ..' –

11

Install GM, (upewnij się, że już zainstalować GraphicsMagick

npm install gm 

Oto mój przykładowy kod, aby połączyć dwa zdjęcie razem (użyj gm.in)

var gm = require('gm'); 

gm() 
.in('-page', '+0+0') 
.in('bg.jpg') 
.in('-page', '+10+20') // location of smallIcon.jpg is x,y -> 10, 20 
.in('smallIcon.jpg') 
.mosaic() 
.write('tesOutput.jpg', function (err) { 
    if (err) console.log(err); 
}); 
15

Po wysiłku na godzinę, oto moje rozwiązanie na twoje pytanie:

gm composite -gravity center change_image_url base_image_url 

gm() 
.command("composite") 
.in("-gravity", "center") 
.in(change_image_url) 
.in(base_image_url) 
.write(output_file, function (err) { 
    if (!err) 
    console.log(' hooray! '); 
    else 
    console.log(err); 
}); 

Powodzenia! Mam nadzieję, że będzie to pomocne także dla innych :)

+0

Czy dodanie adresu URL rzeczywiście działa dla ciebie? Wszystko, co akceptuje dla mnie to ścieżka pliku – NateW

+0

Witam, gdzie się go uczysz? Dokumenty 'gm' nie są dydaktyczne. – Jonathan

0

Mając przyjemność ograniczać się do maszyny Windows na razie rozwiązałem ten problem ostatecznie, nie używając w ogóle modułu "gm". Z jakiegoś powodu, mimo że zainstalowałem magię grafiki za pośrednictwem jej instalatora, moduł węzła odmówił znalezienia go w moich zmiennych środowiskowych. Ale może to mieć coś wspólnego z faktem, że próbuję utworzyć aplikację z Electron.js (która jest podobna do Node.js, ale ma swoją "gotcha's").

var exec = require("child_process").execSync; 
var commandArray = [ 
    __dirname + "/bin/graphicsMagick/gm.exe", // the relative path to the graphics-magick executable 
    "-composite", 
    "-gravity", 
    "center", 
    __dirname + "/data/images/qr/logo-small.png", // relative paths to the images you want to composite 
    __dirname + "/data/images/qr/qr-webpage.png", 
    __dirname + "/data/images/qr/qr-webpage-logo.png" // relative path to the result 
]; 
var returnValue = exec(commandArray.join(" ")); 

W przypadku okien uważam, że jest to właściwy przenośny sposób na zrobienie tego.

1

Dlaczego nikt nie używa komendy composite? (https://github.com/aheckmann/gm)

var gm = require('gm'); 
var bgImage = 'bg.jpg', 
    frontImage = 'front.jpg', 
    resultImage = 'result.jpg', 
    xy = '+100+150'; 

gm(bgImage) 
    .composite(frontImage) 
    .geometry(xy) 
    .write(resultImage, function (err) { 
    if (!err) console.log('All done'); 
    }); 

UPDATE Och, ja oglądałem historię źródło tej metody. Staje się dostępny tylko na 2014

1

Jeśli chcesz zmienić rozmiar i seryjnej, można użyć tego:

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); 
});