帆布图像的羽毛寄宿生

时间:2016-09-19 13:13:35

标签: javascript canvas fabricjs

我有一个加载了以下图片的画布:

背景图片:

Background

正面图片:

Foreground

两者一起看起来像这张图片:

hand2

现在我想对手边的人造成羽毛效果,结果是:

enter image description here

到目前为止,我尝试了以下解决方案。但结果与上图不同。

 
var temp = document.createElement('canvas'),
                tx = temp.getContext('2d');

            temp.width = scope.canvas.width;
            temp.height = scope.canvas.height;

            tx.translate(-temp.width, 0);
            tx.shadowOffsetX = temp.width;
            tx.shadowOffsetY = 0;
            tx.shadowColor = '#000';
            tx.shadowBlur = 100;

            var img = new Image();
            img.onload = function() {
                tx.drawImage(img, 0, 0, 512, 512);
            };
            img.src = imageURL; // the hand image


var temp2 = document.createElement('canvas'),
                tx2 = temp2.getContext('2d');
            temp2.width = scope.canvas.width;
            temp2.height = scope.canvas.height;

            var img2 = new Image();
            img2.onload = function() {
                tx2.drawImage(img2, 0, 0, 512, 512);
                tx2.save();
                tx2.globalCompositeOperation = 'destination-out';
                tx2.drawImage(temp, 0, 0);
                tx2.restore();

  
            };
            img2.src = temp.toDataURL("image/png");

知道如何解决这个问题吗?

此致 史蒂夫

1 个答案:

答案 0 :(得分:2)

要羽化图像,请通过新画布创建它的副本,使用目标输出comp创建图像的反转掩码。然后再次画出手,然后用目的地 - ou遮掩,但用阴影创造羽毛。

var canvas = document.createElement("canvas");
canvas.width = 1024,canvas.height = 1024;
var ctx = canvas.getContext("2d");
document.body.appendChild(canvas);

var hand = new Image();
hand .src = "http://i.stack.imgur.com/PbAfc.png";
hand .onload = function(){
    var can = document.createElement("canvas");
    can.width = this.width;
    can.height = this.height;
    ct = can.getContext("2d");
    // create inverted  mask 
    ct.fillStyle = "black";
    ct.fillRect(0,0,this.width,this.height);
    ct.globalCompositeOperation = "destination-out";
    ct.drawImage(this,0,0);
    // create second canvas
    var can1 = document.createElement("canvas");
    can1.width = this.width;
    can1.height = this.height;
    ct1 = can1.getContext("2d");
    // draw image 
    ct1.drawImage(this,0,0);
    ct1.shadowColor = "black";
    ct1.shadowBlur = 30; // amount of feather
    ct1.globalCompositeOperation = "destination-out";
    ct1.drawImage(can,0,0);
    ct1.shadowBlur = 20; // amount of feather
    ct1.drawImage(can,0,0);  // The mor you draw the greater the FX
    ct1.shadowBlur = 10; // amount of feather
    ct1.drawImage(can,0,0);  // The mor you draw the greater the FX

    ct1.globalCompositeOperation = "source-over";
    ct.globalCompositeOperation = "source-over";
    ctx.drawImage(can1,0,0);  
    // use the new canvas can1 as the hand image in later code.
}
//ctx.fillStyle = "#e19e9e"
ctx.fillRect(0,0,1024,1024);