Есть ли способ в узле gm(графическая магия) обрезать по форме?
Я пытаюсь обрезать изображение по форме изображения и попытался это
let imageDoc = gm(filePath).resize(100, 100);
imageDoc.mask(`${shapesPath}/hexagon.svg`);
Это действует, как будто ничего не было сделано, но изменяет размеры правильно. Также пробовал использовать png файл вместо svg, но результата нет вообще, может есть какой-то способ отладки, или я что-то не так делаю?
1 ответ
По словам пользователя Pirijan:
Маска ничего не делает сама по себе, на самом деле она довольно бесполезна. Он просто берет предоставленное изображение маски и использует его для защиты от записи маскированных пикселей от последующего изменения, если на изображении выполняется дополнительная обработка / рисование.
Так что кажется, что .mask()
полезно только при использовании вместе с другой командой.
Документация для GraphicsMagick может быть довольно запутанной, и я уверен, что существует несколько способов маскировки изображения. Вот как я это делаю:
function mask(img, mask){
gm()
.command("composite")
.compose("CopyOpacity")
.in(img, mask, "-matte")
.write(img, function(err){
if(err){
console.log(err)
} else {
console.log("Success! Image " + img + " was masked with mask " + mask);
}
});
}
Тем не менее, это не использует альфа-канал от mask
вместо этого он работает с черно-белой маской без альфа-канала. Это также требует как img
а также mask
иметь одинаковые размеры.
Он работает путем копирования значения каждого пикселя в mask
на альфа-канал img
, -matte
опция говорит GM создать альфа-канал на img
если его еще нет
Так как node-gm использует библиотеку отладки из visionmedia, вы можете включить отладочный вывод на консоль, установив переменную среды DEBUG=gm
Примерно так (в Unix/OS X):
DEBUG=gm node index.js
Это напечатает точные команды, которые вызывает node-gm.