2014-06-30 6 views
28

In diesem Fall möchte ich Pufferdaten als Eingabe an die gm.in() Methode übergeben.wie man Bildpufferdaten an gm eingibt() GraphicsMagic

Unten ist der Link, auf den ich verweise, aber darin wird ein Bildpfad als Eingabe verwendet. Ich möchte Pufferdaten als Eingabe verwenden. Wie kann ich das machen?

Tile four images together using Node.js and GraphicsMagick

+0

Ich versuche das gleiche zu tun, ich möchte Composite auf aws Lambda verwenden, so muss ich nur mit Streams arbeiten. Ich dachte, dass man Streams benennen und wiederverwenden könnte, aber bisher keinen Erfolg. – jgeerts

+0

Es gibt auch eine 'Seiten'-Funktion auf 'gm' - also statt' in ("- Seite") 'übergeben Sie den Puffer direkt an die' seiten'-Funktion. Das sollte meiner Meinung nach funktionieren. – treecoder

Antwort

2

Eigentlich war ich eines mit einem Text oben Bild Schablonenbild „Hintergrund“ und 2. ist ein Plakat mit zwei verschiedenen Bildern. Ich versuchte mit gm, aber ich verliere Bildqualität. Jemand hat mich angewiesen, Pufferdaten als Eingabe zu verwenden, um die Bildqualität zu verbessern. Ich habe versucht, weiß aber nicht, wie man Pufferdaten als Eingabe übergibt. Endlich entschied ich mich für den Knoten Kindprozess mit Befehlszeichenfolge. Hier ist der Beispielcode, den ich mit Ihnen teile.

var fs = require('fs'); 

var gm = require("gm"); 
var exec = require('child_process').exec; 
var IMAGEFILEPATH = "/images"; 
var gmcreateImage = function() { 

var imageConfig = {"topimage":{"density":"300x300","startx":925,"starty":650,"width":575,"height":825}, 
"offers": [ 
      {"startx": 75, "starty": 850, "msg": "SAVE 5$", "textcolor": "#4f61ac", "font": "Arial Bold", "fontsize":34,"stroke":{"color":"#4f61ac","width":4}}, 
      {"startx": 75, "starty": 970, "msg": "per gallon", "textcolor": "#4f61ac", "font": "Arial Bold", "fontsize":34,"stroke":{"color":"#4f61ac","width":4}}, 
      {"startx": 75, "starty": 1150, "msg": "With the purchase of", "textcolor": "black", "font": "Arial", "fontsize":18,"stroke":{"color":"black","width":1}}, 
      {"startx": 75, "starty": 1260, "msg": "any Pepsi Z0 S2", "textcolor": "black", "font": "Arial", "fontsize":16,"stroke":{"color":"black","width":1}}, 
      {"startx": 75, "starty": 1370, "msg": "on all flavours", "textcolor": "black", "font": "Arial", "fontsize":16,"stroke":{"color":"black","width":1}}, 
      {"startx": 75, "starty": 1480, "msg": "Ask for details.", "textcolor": "black", "font": "Arial", "fontsize":18,"stroke":{"color":"black","width":1}} 
]}; 
    var addLast=imageConfig.topimage.last; 
    var commandStr = "gm convert '-page' '+0+0' '-units' 'PixelsPerInch' '-density' '" + imageConfig.topimage.density + "' '" + IMAGEFILEPATH+ "/template.jpg' "; 

    var imageActualPosition={}; 
    imageActualPosition["x"] = imageConfig.topimage.startx; 
    imageActualPosition["y"] = imageConfig.topimage.starty; 

    if (!addLast) { 
     commandStr += " '-page' '+" + imageActualPosition["x"] + "+" + imageActualPosition["y"] + "' '" + IMAGEFILEPATH + "/top.jpg' "; 
    } 

    var offers = imageConfig.offers; 
    for (var i in offers) { 
     var color = offers[i].textcolor; 
     var startX = offers[i].startx; 
     var startY = offers[i].starty; 
     var font = offers[i].font; 
     var fontSize = offers[i].fontsize; 
     var msg = offers[i].msg; 
     var offerStr = ""; 
     if (offers[i].stroke) { 
      offerStr += " '-stroke' '" + offers[i].stroke.color + "' '-strokewidth' '" + offers[i].stroke.width + "'"; 
     } 
     offerStr += " '-fill' '" + color + "' '-pointsize' '" + fontSize + "' '-draw' 'text " + startX + " " + startY + " \"" + msg + "\"'"; 
     commandStr += offerStr; 
    } 
    if (addLast) { 
     commandStr += " '-page' '+" + imageActualPosition["x"] + "+" + imageActualPosition["y"] + "' '" + IMAGEFILEPATH + "/top.jpg' "; 
    } 
    var finalImage="done.jpg"; 
    commandStr += " '-mosaic' '-quality' '100' '" + IMAGEFILEPATH + finalImage + "'"; 
    exec(commandStr, function(err, stdout, stderr) { 
      if (err) { 
       console.log("Error while executing gm commands" + err); 
       return; 
      } else { 
       console.log("Done See your image"); 
      } 
    }) 
}; 
gmcreateImage(); 
+0

Dies beantwortet die Frage nicht. Sie verwenden keine Pufferdaten zum Verarbeiten, Sie verwenden einen untergeordneten Prozess, der mit einer vorhandenen Datei kombiniert ist. Schön, dass es für dich funktioniert, aber es gehört nicht als Antwort auf diese Frage. – imjared

+1

Ja, ich stimme dir zu, das ist nicht die Antwort auf diese Frage. Aber ich teile nur mit, wie ich dieses Problem in meinem Fall gelöst habe. Denn als Entwickler müssen wir die Lösung vielleicht mit anderen Ansatz finden. :) –

2

Ohne die Quelle von GraphicsMagick selbst zu ändern, können Sie nicht. Das Modul gm interagiert mit dem GraphicsMagick-Programm über die Befehlszeile. Die Argumente, die Sie über die .in()-Methode übergeben, werden in Befehlszeilenargumente konvertiert. Das GraphicsMagick-Programm akzeptiert nur Dateinamen für dieses Argument und versucht nicht, direkte Daten zu verarbeiten.

Wenn Sie wirklich ohne das Dateisystem arbeiten mussten, konnten Sie den GraphicsMagick-Quellcode immer herunterladen und die CLI ändern, um eine Form von Datenblob anstelle einer URL für dieses Argument zu akzeptieren.

0

Ich habe nicht herausgefunden, wie es geht sowohl mit einem image und den watermark als Puffer, aber ich habe herausgefunden, wie das Bild zu halten als Puffer:

gm(imageBuffer) 
    .composite('./logo_path.png') 
    .geometry(geometry) 
    .gravity('SouthEast') 
    .dissolve(this.options.opacity) 
    .toBuffer(function (err, buffer) { 
     next(err, buffer, 'image/jpeg'); 
    }); 
}; 

Schauen Sie sich den Code in dies great library für weitere Informationen.

Verwandte Themen