GraphicsMagick для узла, не маскирующего

Я использую GraphicsMagick для узла, чтобы взять исходное изображение, изменить его размер, обрезать и затем применить маску:

      gm(tempfile)
        .quality(90)
        .resize(null, 38)
        .gravity('Center')
        .crop(20, 34)
        .mask('./public/assets/mask.png')
        .write(thumb, function (err) {
          if (err) throw err
          console.log('success')
        })

После запуска изображение успешно изменяется и обрезается, но маска не применяется. Ошибка не выдается (то есть консоль выводит "success").

К нему также прикреплено изображение маски, которое я пытаюсь использовать. Я хочу, чтобы изображение рисовалось только на черной части. Я пробовал использовать прозрачный png (в gm docs говорят, что он маскируется на основе альфа-канала), а также черно-белый jpg, но результат тот же.

образец маски img

Я уверен, что упускаю что-то очевидное, но я в тупике Спасибо!

2 ответа

Решение

Итак, после еще одного дня или около того я понял это:

Маска ничего не делает сама по себе, на самом деле она довольно бесполезна. Он просто берет предоставленное изображение маски и использует его для защиты от записи маскированных пикселей от последующего изменения, если на изображении выполняется дополнительная обработка / рисование.

Поскольку Node GM не поддерживает составные, мое решение состоит в том, чтобы применить маску с помощью системного вызова. Поскольку, кажется, нет никакого способа объединить кадрирование и композитный состав за один шаг ( композитный файл graphicsmagick и кадрирование одной командой), я сделал это в два этапа:

      var exec = require('child_process').exec
      gm = require('gm')

      gm(tempfile)
        .quality(90)
        .resize(null, thumbOffset)
        .gravity('Center')
        .crop(thumbWidth, thumbHeight)
        .write(thumb, function (err) {
          if (err) throw err
          console.log('thumb sized')
          compositeMask(thumb, mask, function(){
            console.log('mask1 done')
          })
        })

      function compositeMask(thumb, mask, next) {
        var gmComposite = 'gm composite -compose in ' + thumb + ' ' + mask + ' ' + thumb
        exec(gmComposite, function(err) {
          if (err) throw err
          pathUpdate(entryID, { thumb: thumb })
          next()
        })
      }

Прошло 10 лет с тех пор, как был задан этот вопрос. Вот решение, которое я придумал, которое работает в модуле узла для GM.

            gm(sourceFilepath)
        .alpha("Off")
        .compose("CopyOpacity")
        .composite(maskFilePath)
        .write(savePath, function (err) {
          if (err) console.error(err);
          if (!err) console.log("Written composite image.");
        });
Другие вопросы по тегам