2016-04-06 13 views
0

Node-gm dairesel görüntü kırpması Görüntüyü dairesel olarak kırpmak için node-gm + Imagemagick'i kullanmaya çalışıyorum.Imagemagick

Her neyse, burada siyah bir daire kullanarak maske oluşturma girişimi.

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'); 
       }); 
      }); 

    }); 

Bu bazı fantezi dize komut birleştirme yoluyla yapılabilir eminim, ama görüntü işleme yiğitliği benim eksikliği rağmen, hala temiz kod tutmak istiyorum. Düğüm-gm işlevlerini kullanarak, tercihen benim girişimin (örneğin, benimkinden farklı olarak çalışan bir şey) daha az harekatla bir çözümü arıyorum.

Ayrıca tüm zincir fonksiyonu bir başarı ile bu komutun çağrıları çalışılmıştır: Belirli bir yere kırpmak için gereken https://stackoverflow.com/a/999563/1267778

Not (W, H, x, y) bu nedenle bu çözüm de don' Benim için çalışamam:

node-pngjs

node-circle-image

cevap

0

Anladım! Birkaç saat çalıştıktan sonra, ihtiyacım olan şeyi tam olarak aldım. Kullanıcı tarafından ön uç görüntü kesme ve kırpma koordinatları (W, H, x, y) geçmesine izin vermek için JCrop kullanıyorum

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'); 
     }); 
    }); 

().