2

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)でトリミングする必要があるため、これらのソリューションも機能しないことに注意してください。

ノード-pngjs

ノード サークル イメージ

4

1 に答える 1

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() に渡すことができるようにしています。

于 2016-04-06T04:18:43.713 に答える