2016-08-30 7 views
0

Я пытаюсь обрезать изображения с изображением формы и попытался этоЕсть ли способ в узеле gm (графическая магия) обрезать по форме?

let imageDoc = gm(filePath).resize(100, 100); 

imageDoc.mask(`${shapesPath}/hexagon.svg`); 

Он действует как ничего не было сделано, но изменяет правильно. Также пытался использовать png-файл вместо svg, но результата совсем нет, может быть, есть какой-то способ его отладки, или я что-то делаю неправильно?

ответ

1

По user 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, если он еще не установлен.

Поскольку узел-гм использует debug library from visionmedia вы можете включить отладочный вывод в консоль, установив переменную окружения DEBUG=gm, например, так (в Unix/OS X):

DEBUG=gm node index.js 

Это напечатает точные команды что node-gm вызывает.