Есть ли способ в узле 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.

Другие вопросы по тегам