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, но результат тот же.
Я уверен, что упускаю что-то очевидное, но я в тупике Спасибо!
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.");
});