Node-GM круговое изображение кадрирования с помощью Imagemagick
Я пытался использовать node-gm + Imagemagick для круговой обрезки изображения.
В любом случае, вот моя попытка создать маску с использованием черного круга.
var original = 'app-server/photo.jpg';
var output = 'app-server/photo.png';
var maskPath = 'app-server/photo-mask.png';
gm(original)
.crop(233, 233,29,26)
.resize(80, 80)
.setFormat('png')
.write(output, function (err) {
console.log(err || 'cropped to target size');
gm(output)
.out('-size', '80x80')
.background('black')
.drawCircle(20,20, 0, 0)
.toBuffer('PNG',function (err, buffer) {
console.log(err || 'created circular black mask');
//docs say "a buffer can be passed instead of
//a filepath" but this is apparently false
//and say something unclear about using black/white colors for masking.
//I'm clearly lost
gm(output)
.mask(maskPath)
.write(output, function (err) {
console.log(err || 'applied circular black mask to image');
});
});
});
Я уверен, что это можно сделать с помощью какой-то необычной конкатенации строковых команд, но, несмотря на отсутствие у меня мастерства обработки изображений, я все же хочу сохранить код в чистоте. Я действительно ищу решение, использующее функции node-gm, желательно с меньшим количеством операций, чем моя попытка (также предпочтительно что-то, что работает, в отличие от моей).
Я также попытался зацепить вызовы функций для этой команды, но безуспешно: /questions/34256954/obrezat-ili-zamaskirovat-izobrazhenie-v-krug/34256961#34256961
Обратите внимание, что мне нужно обрезать в определенном месте (w,h,x,y), чтобы эти решения также не работали для меня:
1 ответ
Понял! После многих часов возни я получил именно то, что мне было нужно.
gm(originalFilePath)
.crop(233, 233,29,26)
.resize(size, size)
.write(outputFilePath, function(err) {
gm(size, size, 'none')
.fill(outputFilePath)
.drawCircle(size/2,size/2, size/2, 0)
.write(output, function(err) {
console.log(err || 'done');
});
});
Я использую JCrop, чтобы позволить пользователю обрезать изображение на внешнем интерфейсе и передать координаты (w,h,x,y) в crop().