HTML5 Canvas学习---第四章 《Canvas区域裁剪及混合显示》

  混合使用save()和restore()方法,我们可以限定画画区域。首先我们可以使用rect()方法包围一个我们希望画画的区域,然后使用clip()方法把该区域裁剪下来。

这样以后我们不管在context中做了什么操作,只有限定的部分显示出来。也就是说clip()的作用是限定要显示的区域。当我们不希望继续限定区域了,可以使用restore()方法跳出来,继续操作原来的context。

function drawScreen() {
        var x = canvas.width / 2;
        var y = canvas.height / 2;
        var radius = 75;
        var offset = 50;

        //裁剪的区域为 (x, y)为中心半径为75的圆
        context.save();
        context.beginPath();
        context.arc(x, y, radius, 0, 2 * Math.PI, false);
        context.clip();

        // 先画一个蓝色的圆弧, 超过裁剪的部分不显示
        context.beginPath();
        context.arc(x - offset, y - offset, radius, 0, 2 * Math.PI, false);
        context.fillStyle = 'blue';
        context.fill();

        // 画一个黄色的圆弧, 超过裁剪的部分不显示
        context.beginPath();
        context.arc(x + offset, y, radius, 0, 2 * Math.PI, false);
        context.fillStyle = 'yellow';
        context.fill();

        // 画一个红色的圆弧, 超过裁剪的部分不显示
        context.beginPath();
        context.arc(x, y + offset, radius, 0, 2 * Math.PI, false);
        context.fillStyle = 'red';
        context.fill();

        /*
         * restore()方法会返回到context原先的状态,在这里是clip()之前的状态。
         * 大家可以移除context.beginPath()方法,试试会发生什么。
         */
        context.restore();
        context.beginPath();
        context.arc(x, y, radius, 0, 2 * Math.PI, false);
        context.lineWidth = 10;
        context.strokeStyle = 'blue';
        context.stroke();
    }

再次强调,一般使用裁剪功能的调用形式是

  1. save();
  2. clip();
  3. restore();

这个顺序来进行调用。

在Canvas中混合显示

  • globalAlpha:透明度(0.0:完全透明)--》(1.0:完全不透明),在canvas画图进行之前该值要设置
  • globalCompositeOperation:定义我们希望画的图像的形状

  • destination:canvas当前显示的bitmap
  • source:我们要在canvas中画的形状
function drawScreen() {
        var squareWidth = 55;
        var circleRadius = 35;
        var shapeOffset = 50;
        var operationOffset = 150;
        var arr = [];

        arr.push('source-atop');
        arr.push('source-in');
        arr.push('source-out');
        arr.push('source-over');
        arr.push('destination-atop');
        arr.push('destination-in');
        arr.push('destination-out');
        arr.push('destination-over');
        arr.push('lighter');
        arr.push('darker');
        arr.push('xor');
        arr.push('copy');

        thisOperation = arr[0];
        context.beginPath();
        context.rect(0, 0, squareWidth, squareWidth);
        context.fillStyle = 'blue';
        context.fill();

        // 设置globalComposite
        context.globalCompositeOperation = thisOperation;

        // 画一个实心圆弧
        context.beginPath();
        context.arc(shapeOffset, shapeOffset, circleRadius, 0, 2 * Math.PI, false);
        context.fillStyle = 'red';
        context.fill();
    }

 

  虽然参数的值有点多,但我们需要多次联系,直到完全掌握为止。

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/tcpcg/archive/2012/12/06/2804332.html

weixin063传染病防控宣传微信小程序系统的设计与实现+springboot后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值