Подтвердить что ты не робот

Как передать данные буфера изображения в gm in() GraphicsMagic

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

в этом случае я хочу передать данные буфера в качестве входных данных методу gm.in().

Ниже ссылка, на которую я ссылаюсь, но в ней используется путь изображения. Я хочу использовать данные буфера в качестве ввода. Как я могу это сделать?

Сложите четыре изображения вместе с помощью Node.js и GraphicsMagick

4b9b3361

Ответ 1

Без изменения источника GraphicsMagick вы не сможете. Модуль gm взаимодействует с программой GraphicsMagick через командную строку. Аргументы, которые вы передаете через метод .in(), преобразуются в аргументы командной строки. Программа GraphicsMagick принимает только имена файлов для этого аргумента и не будет пытаться обрабатывать прямую форму данных.

Если вам действительно нужна эта работа без файловой системы, вы всегда можете загрузить исходный код GraphicsMagick и изменить CLI, чтобы принять какую-либо форму данных blob вместо URL для этого аргумента.

Ответ 2

На самом деле я создавал плакат с двумя разными изображениями, один - "образ" шаблона, а второй - верхнее изображение с некоторым текстом. Я попытался с gm, но я потерял качество изображения. Кто-то помогает мне использовать данные буфера в качестве входных данных для улучшения качества изображения. Я попытался, но не знаю, как передать данные буфера в качестве входных данных. Поэтому, наконец, я решил использовать дочерний процесс node с командной строкой. Вот пример кода, который я использую с вами.

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

Ответ 3

Я не понял, как это сделать с помощью 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');
    });
};

Подробнее читайте в отличной библиотеке.