使用Imagemagick进行Node-gm圆形图像裁剪

时间:2016-04-06 03:30:13

标签: imagemagick node-imagemagick node-gm

我一直在尝试使用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

注意我需要在特定位置(w,h,x,y)进行裁剪,因此这些解决方案对我来说也不起作用:

node-pngjs

node-circle-image

1 个答案:

答案 0 :(得分: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()。