【问题标题】:Cropping Image to Oval in HTML5 Canvas在 HTML5 Canvas 中将图像裁剪为椭圆形
【发布时间】:2015-11-11 15:41:11
【问题描述】:

我一直在尝试使用创建另一个画布、剪裁、保存然后将图像绘制到我的主画布上的方法将图像裁剪为椭圆形。但是,它只显示黑色椭圆形而没有覆盖在顶部的图像

var Ctx = document.getElementById('canvas').getContext('2d');
var tCan = document.createElement('canvas');
var tCtx = tCan.getContext('2d');


tCtx.beginPath();
var centerX = 50;
var centerY = 50;
var width = 100;
var height = 100;

tCtx.moveTo(centerX, centerY - height/2);

tCtx.bezierCurveTo(
centerX + width/2, centerY - height/2,
centerX + width/2, centerY + height/2,
centerX, centerY + height/2);

tCtx.bezierCurveTo(
centerX - width/2, centerY + height/2,
centerX - width/2, centerY - height/2,
centerX, centerY - height/2);

tCtx.fillStyle = "black";
tCtx.fill();
tCtx.closePath();   

var img = new Image();
img.onload = function(){
tCtx.drawImage(img,1,1, 98, 98);
};

img.src = 'http://imgur.com/GvRewu7.png';

tCtx.clip();

var cSi = tCan.toDataURL();

var cImg = new Image();
cImg.src = cSi;

Ctx.drawImage(cImg,0,0);

为什么这不包括裁剪的图像?有没有其他方法可以做到这一点(完全在 javascript 中)?

编辑:我的活动 JSBin 页面:https://jsbin.com/yulituc/edit?js,output

【问题讨论】:

    标签: javascript html canvas


    【解决方案1】:

    jsFiddle:https://jsfiddle.net/mdofqjx2/3/

    您尚未将新的 canvas 元素附加到页面。我已经在下面为你修好了

    HTML:

    <canvas id="canvas" width="400" height="400">
    </canvas>
    <canvas id="canvas2" width="400" height="400">
    </canvas>
    

    Javascript:

    var Ctx = document.getElementById('canvas').getContext('2d');
    var tCan = document.getElementById('canvas2');
    var tCtx = tCan.getContext('2d');
    
    tCtx.beginPath();
    var centerX = 50;
    var centerY = 50;
    var width = 100;
    var height = 100;
    
    tCtx.moveTo(centerX, centerY - height/2);
    
    tCtx.bezierCurveTo(
    centerX + width/2, centerY - height/2,
    centerX + width/2, centerY + height/2,
    centerX, centerY + height/2);
    
    tCtx.bezierCurveTo(
    centerX - width/2, centerY + height/2,
    centerX - width/2, centerY - height/2,
    centerX, centerY - height/2);
    
    tCtx.fillStyle = "black";
    tCtx.fill();
    tCtx.closePath();   
    
    var img = new Image();
    img.onload = function(){
    tCtx.drawImage(img,1,1, 98, 98);
    };
    
    img.src = 'http://imgur.com/GvRewu7.png';
    
    tCtx.clip();
    
    var cSi = tCan.toDataURL();
    

    通过椭圆裁剪图像的简单方法

    jsFiddle:https://jsfiddle.net/mdofqjx2/1/

    您可以创建一条路径,然后画一个圆。如果你想画一个椭圆,只需修改比例ctx.scale

    var c = document.getElementById('myCanvas');
    var ctx = c.getContext("2d");
    
    var img = new Image();
    img.src = "https://pbs.twimg.com/profile_images/378800000532546226/dbe5f0727b69487016ffd67a6689e75a.jpeg";
    
    img.onload = function()
    {
        ctx.fillRect(0,0,c.width,c.height);
    
        ctx.save();
        ctx.scale(2,1);
        ctx.beginPath();
        ctx.arc(150, 150, 150, 0, Math.PI * 2, true);
        ctx.closePath();
        ctx.clip();
        ctx.scale(0.5,1);
        ctx.drawImage(img, 0, 0);
        ctx.restore(); 
    }
    

    【讨论】:

    • 谢谢!我使用“简单方法”并设法插入我的贝塞尔曲线来代替绘制弧线(课程作业限制),它仍然有效。查看固定版本,我需要重复执行此操作,因此添加新的 cavases(canvasi?)并不是一个真正的选择。
    • 您可以做的就是在启动时在您的页面上创建两个画布,然后参考这两个画布,我已经更新了我的答案
    • 不错的答案——点赞。由于 OP 评论说他们需要重复执行此操作,因此您还可以使用合成显示绘制成椭圆形。合成是在 GPU 上完成的,因此您可以获得硬件加速的性能优势。
    猜你喜欢
    • 2014-05-01
    • 1970-01-01
    • 2011-09-19
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 2012-10-08
    • 2016-05-01
    相关资源
    最近更新 更多