2016-04-06 3 views
0

Я пытаюсь использовать 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, желательно с меньшим количеством операций, чем моя попытка (также предпочтительно что-то, что работает, в отличие от моего).

Я также пытался цепь из вызовов функций для этой команды без успеха: https://stackoverflow.com/a/999563/1267778

Примечания Мне нужно обрезать в определенном месте (ш, ч, х, у), так что эти решения также не» т работа для меня:

node-pngjs

node-circle-image

ответ

0

Понял! После многих часов возиться, я получил именно то, что мне нужно.

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, чтобы позволить пользователю, чтобы обрезать изображение на переднем конце и передать координаты (ш, ч, х, у) в культуре().

Смежные вопросы