2014-06-30 7 views
28
var buf = require('fs').readFileSync('test.jpg'); 

gm().in('-page', '+0+0').in(buf,'test.jpg').write('output.jpg', function (err) { 
    if (err) console.log(err); 
}) 

ग्राम के लिए छवि बफर डेटा पास करने के।कैसे इस मामले मैं <code>gm.in()</code> विधि के लिए इनपुट के रूप में बफर डेटा पास करना चाहते हैं में में() GraphicsMagic

नीचे दिया गया लिंक मैं संदर्भित कर रहा हूं लेकिन इसमें एक छवि पथ इनपुट के रूप में उपयोग किया जाता है। मैं इनपुट के रूप में बफर डेटा का उपयोग करना चाहता हूं। मैं यह कैसे कर सकता हूँ?

Tile four images together using Node.js and GraphicsMagick

+0

वही काम करने की कोशिश कर रहा है, मैं aws lambda पर समग्र उपयोग करना चाहता हूं इसलिए मुझे पूरी तरह से स्ट्रीम के साथ काम करना है। मैं सोच रहा था कि आप धाराओं का नाम दे सकते हैं और उनका पुन: उपयोग कर सकते हैं लेकिन अब तक कोई सफलता नहीं है। – jgeerts

+0

'gm' पर भी 'पृष्ठ' फ़ंक्शन है - इसलिए 'in (" - page ")' का उपयोग करने के बजाय, बफर को' पेज' फ़ंक्शन पर सीधे पास करें। मुझे लगता है कि काम करना चाहिए। – treecoder

उत्तर

2

असल में मैं दो अलग छवि एक टेम्पलेट छवि "पृष्ठभूमि" और 2 है के साथ एक पोस्टर बनाकर किया गया था कुछ पाठ के साथ शीर्ष छवि है। मैंने gm के साथ प्रयास किया लेकिन मैंने छवि की गुणवत्ता खो दी। कोई मुझे छवि गुणवत्ता में सुधार के लिए इनपुट के रूप में बफर डेटा का उपयोग करने के लिए मार्गदर्शन करता है। मैंने कोशिश की लेकिन बफर डेटा को इनपुट के रूप में कैसे पास किया जाए, यह नहीं पता। तो अंततः मैंने कमांड स्ट्रिंग के साथ नोड बाल प्रक्रिया का उपयोग करने का निर्णय लिया। यहां नमूना कोड है जो मैं आपके साथ साझा कर रहा हूं।

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

यह सवाल का जवाब नहीं देता है। आप प्रक्रिया करने के लिए बफर डेटा का उपयोग नहीं कर रहे हैं, आप एक मौजूदा फाइल के साथ एक बाल प्रक्रिया combo'd का उपयोग कर रहे हैं। खुशी है कि यह आपके लिए काम करता है लेकिन यह इस प्रश्न का उत्तर नहीं है। – imjared

+1

हाँ मैं आपसे सहमत हूं कि यह इस प्रश्न का उत्तर नहीं है। लेकिन मैं सिर्फ यह साझा करता हूं कि मैंने इस मामले को अपने मामले में कैसे हल किया। क्योंकि एक डेवलपर के रूप में हमें समाधान को अलग-अलग दृष्टिकोण के साथ मिलना होगा। :) –

2

ग्राफिक्स मैगिक के स्रोत को संशोधित किए बिना, आप नहीं कर सकते। gm मॉड्यूल कमांड लाइन के माध्यम से GraphicsMagick प्रोग्राम के साथ इंटरैक्ट करता है। .in() विधि के माध्यम से आप जिन तर्कों को पारित कर रहे हैं वे कमांड-लाइन तर्कों में परिवर्तित हो रहे हैं। ग्राफिक्स मैगिक प्रोग्राम केवल इस तर्क के लिए फ़ाइल नाम स्वीकार करता है और डेटा के किसी भी प्रत्यक्ष रूप को संसाधित करने का प्रयास नहीं करेगा।

तुम सच में फाइल सिस्टम के बिना यह काम बनाने के लिए आवश्यक हैं, तो आप हमेशा GraphicsMagick स्रोत कोड डाउनलोड करने और बजाय इस तर्क के लिए एक URL डेटा ब्लॉब के कुछ फार्म स्वीकार करने के लिए CLI बदल सकता है।

0

मैं पता लगा नहीं है कि कैसे दोनों एक image और watermark बफर के रूप में के साथ यह करने के लिए है, लेकिन मैं पता लगा है एक बफर के रूप में छवि रखने के लिए कैसे:

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

चेक बाहर कोड में अधिक जानकारी के लिए यह great library

संबंधित मुद्दे