Добавление текста к изображениям с помощью функций ImageMagick и Google Cloud - PullRequest
0 голосов
/ 16 мая 2018

Кому-нибудь удалось получить добавление текста к изображениям, работающим с помощью ImageMagick, в облачных функциях Google? Я пытался использовать аннотирование, метку, рисовать, и мне не повезло ни с одним. Я делаю все на веб-платформе Google Cloud Functions, так что нет необходимости в мобильной интеграции или чем-то подобном.

1 Ответ

0 голосов
/ 24 февраля 2019

TL; DR: поместите файл TTF в тот же каталог, в котором выполняется ваша функция (у меня было /user_code), и обращайтесь непосредственно к этому шрифту при запуске графической магии.


Хорошо, поэтому я , похоже, нашел какое-то решение.Мои обстоятельства не совсем совпадают с вашими, но я видел то же поведение, что и вы.Вместо того, чтобы порождать процесс, я использую библиотеку-оболочку NPM GraphicsMagick, GM (https://www.npmjs.com/package/gm).. Это должно быть очень похоже. Я также выполняю свои функции через функции firebase, которые просто запускают Google Cloud Functions, но я делаюУ меня нет доступа к конфигурации, поэтому я не могу убедиться, что она просто использует значения по умолчанию. Я предполагаю, что она использует любой образ функции облачной функции по умолчанию. В любом случае на этом образе явно установлено некоторое подмножество ImageMagick,и обычные текстовые функции выполняются успешно, но никак не изменяют вывод изображения.

В конечном итоге было решено загрузить файл шрифта с моим кодом для использования. Системные шрифты, такие как arial, которые вы ожидаетебыть доступным не работает. Я успешно использовал https://www.theleagueofmoveabletype.com/league-mono и использовал следующий код для успешного рисования текста в облачных функциях Google:

var gm = require('gm').subClass({ imageMagick: true });
require('gm-base64');

/* ...handler code... */ 

      gm(525, 110, '#ffffffdd')
        .fill('#000000dd')
        .drawCircle(100, 100, 120, 5)
        .font('font.ttf', 20)
        .fill('#00ff00dd')
        .drawText(100, 100, 'graphics')
        .toBase64('png', function(err, base64) {
          if (err != null) {
            throw err;
          }
          console.info(`got base64 encoding: ${base64}`);
          var img = new Buffer(base64, 'base64');

          res.writeHead(200, {
            'Content-Type': 'image/png',
            'Content-Length': img.length,
          });
          res.end(img);
        });

Это привело к следующему выводу: generated image

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

...