()GraphicsMagic中如何将图像缓冲区数据传递给gm

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

在这种情况下,我想传递缓冲区数据作为input到gm.in()方法。

下面是我参考的链接,但在其中,图像path被用作input。 我想使用缓冲区数据作为input。 我怎样才能做到这一点?

使用Node.js和GraphicsMagick将四个图像拼接在一起

其实我是用两个不同的图像创build一个海报,一个是模板图像“背景”,第二个是一些文本的顶部图像。 我尝试过,但是我的图像质量gm 。 有人指导我使用缓冲区数据作为input来改善图像质量。 我尝试过,但不知道如何通过缓冲区数据作为input。 所以最后我决定使用命令string来使用节点subprocess。 这里是我与你分享的示例代码。

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

不修改GraphicsMagick本身的源代码,你不能。 gm模块通过命令行与GraphicsMagick程序交互。 您通过.in()方法传递的参数正被转换为命令行参数。 GraphicsMagick程序只接受该参数的文件名,不会尝试处理任何直接forms的数据。

如果您确实需要在没有文件系统的情况下进行这项工作,则可以始终下载GraphicsMagick源代码,并将CLI更改为接受某种forms的数据blob,而不是此参数的URL。

我还没有想出如何将imagewatermark作为缓冲区来实现,但是我已经想出了如何将图像保存为缓冲区:

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

看看这个伟大的图书馆的代码了解更多信息。