返回顶部
首页 > 资讯 > 精选 >canvas中globalCompositeOperation属性的示例分析
  • 472
分享到

canvas中globalCompositeOperation属性的示例分析

2023-06-14 20:06:09 472人浏览 泡泡鱼
摘要

这篇文章给大家分享的是有关canvas中globalCompositeOperation属性的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。说明最早知道 canvas 的 globalCompositeO

这篇文章给大家分享的是有关canvas中globalCompositeOperation属性的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

说明

最早知道 canvas 的 globalCompositeOperation 属性,是在需要实现一个刮刮卡效果的时候,当时也就是网上找到刮刮卡的效果赶紧完成任务就完了,这次又学习一次,希望能加深理解吧。

先来看下 canvas 的 globalCompositeOperation属性,具体是干什么的。

定义

globalCompositeOperation 属性设置或返回如何将一个源(新的)图像绘制到目标(已有)的图像上。
源图像 = 您打算放置到画布上的绘图。
目标图像 = 您已经放置在画布上的绘图。

这个属性用来设置要在绘制新形状时应用的合成操作的类型,比如在一个蓝色的矩形上画一个红色的圆形,是红色在上显示,还是蓝色在上显示,重叠的部分显示还是不显示,不重叠的部分又怎么显示,等一些情况,在面对这些情况的时候,就是 globalCompositeOperation 属性起作用的时候了。
在取默认值的情况下,都是显示的,新画的图形会覆盖原来的图形。

用法

默认值: source-over
语法: context.globalCompositeOperation="source-in";

表格中的蓝色矩形为目标图像,红色圆形为源图像。

属性值描述效果
source-over默认。在目标图像上显示源图像。canvas中globalCompositeOperation属性的示例分析
source-atop在目标图像顶部显示源图像。源图像位于目标图像之外的部分是不可见的。canvas中globalCompositeOperation属性的示例分析
source-in在目标图像中显示源图像。只有目标图像内的源图像部分会显示,目标图像是透明的。canvas中globalCompositeOperation属性的示例分析
source-out在目标图像之外显示源图像。只会显示目标图像之外源图像部分,目标图像是透明的。canvas中globalCompositeOperation属性的示例分析
destination-over在源图像上方显示目标图像。canvas中globalCompositeOperation属性的示例分析
destination-atop在源图像顶部显示目标图像。源图像之外的目标图像部分不会被显示。canvas中globalCompositeOperation属性的示例分析
destination-in在源图像中显示目标图像。只有源图像内的目标图像部分会被显示,源图像是透明的。canvas中globalCompositeOperation属性的示例分析
destination-out在源图像外显示目标图像。只有源图像外的目标图像部分会被显示,源图像是透明的。canvas中globalCompositeOperation属性的示例分析
lighter显示源图像 + 目标图像。canvas中globalCompositeOperation属性的示例分析
copy显示源图像。忽略目标图像。canvas中globalCompositeOperation属性的示例分析
xor使用异或操作对源图像与目标图像进行组合。canvas中globalCompositeOperation属性的示例分析

好的,下来实现一个水滴扩散的效果:

https://codepen.io/FEWY/pen/oPxbmj

效果图

canvas中globalCompositeOperation属性的示例分析

实现思路

在一个 canvas 上先画出黑白色的图片,然后设置背景是一张彩色的图片,鼠标点击时,设置 canvas 的 globalCompositeOperation 属性值为 destination-out,根据鼠标在 canvas 中的 坐标,用一个不规则的图形逐渐增大,来擦除掉黑白色的图片,就可以慢慢显示彩色的背景了。

也就是说我们需要三张图片

黑白的图片

canvas中globalCompositeOperation属性的示例分析

彩色的图片

canvas中globalCompositeOperation属性的示例分析

不规则形状的图片

canvas中globalCompositeOperation属性的示例分析

代码

<!doctype html><html><head>    <meta charset="UTF-8">    <style>        canvas {                                    cursor: url('Https://www.kkkk1000.com/images/globalCompositeOperation/mouse.png') 16 22, auto;        }    </style></head><body>    <canvas id="canvas" width="400px" height="250px"></canvas>    <script type="text/javascript">         var canvas = document.getElementById("canvas");        var context = canvas.getContext("2d");        // 保存图片路径的数组        var urlArr = ["https://www.kkkk1000.com/images/globalCompositeOperation/bg2.png", "https://www.kkkk1000.com/images/globalCompositeOperation/clear.png"];        // imgArr 保存加载后的图片的数组,imgArr中保存的是真实的图片        // loadImg 函数用来加载 urlArr 中所有的图片        // 并返回一个保存所有图片的数组        var imgArr = loadImg(urlArr);        // flag 用来限制 点击事件,一张图片只会产生一次效果        var flag = false;         function loadImg(urlArr) {            var index = 0;            var res = [];            // 每次给 load 函数传入一个图片路径,来加载图片            load(urlArr[index]);            function load(url) {                // 如果 index 等于 urlArr.length,                // 表示加载完 全部图片了,就结束 load函数                if (index == urlArr.length) {                    // 加载完全部图片,调用 init 函数                    init();                    return;                }                var img = new Image();                img.src = url;                // 不管当前图片是否加载成功,都要加载下一张图片                img.onload = next;                img.onerror = function () {                    console.log(res[index] + "加载失败");                    next();                }                // next 用来加载下一张图片                function next() {                    // 把加载后的图片,保存到 res 中                    res[index] = img;                    load(urlArr[++index])                }            }            // 最后返回保存所有真实图片的数组            return res;        }        function init() {            // 先在canvas上画黑白的图片,然后再设置背景是彩色的图片            // 避免先显示出彩色图片,再显示出黑白的图片            context.globalCompositeOperation = "source-over";            context.drawImage(imgArr[0], 0, 0, 400, 250);            canvas.style.background = 'url(https://www.kkkk1000.com/images/globalCompositeOperation/bg.jpg)';            canvas.style.backgroundSize = "100% 100%";            // flag 是 true 时,鼠标点击才有水滴扩散的效果            flag = true;            // canvas 绑定点击事件,点击时产生水滴扩散效果            canvas.onclick =  diffusion;        }        // width 表示 不规则形状的图片的尺寸        var width = 0;        // speed 表示扩散效果的速度        var speed = 8;        // diffusion 函数根据鼠标坐标,产生效果        function  diffusion (e) {            if (flag) {                flag = false;                context.globalCompositeOperation = "destination-out";                window.requestAnimationFrame(draw);                // 根据鼠标坐标,画扩散效果                function draw() {                    // 这里不一定需要是 1800 ,但必须是一个足够大的数,可以扩散出整张背景图                    if (width > 1800) {                        flag = true;                        return;                    }                    width += speed;                    // 获取鼠标相对于 canvas 的坐标                    var x = e.layerX;                    var y = e.layerY;                    // 画不规则形状的图片,逐渐增大图片尺寸                    context.drawImage(imgArr[1], x - (width / 2), y - (width / 2), width, width);                    window.requestAnimationFrame(draw);                }            }        }    </script></body></html>

我们继续来实现一个刮刮卡的效果

效果图

canvas中globalCompositeOperation属性的示例分析

刮刮卡效果实现的思路:

一个 canvas 上先画一层灰色,然后设置canvas的背景图,设置 canvas 的 globalCompositeOperation属性值为 destination-out,点击并移动时,根据移动点的坐标,擦除掉灰色,当擦掉一部分时,再自动擦除掉全部灰色,显示出背景来。

刮刮卡的效果和水滴扩散的效果,在开始的时候几乎是一样的,不过水滴扩散效果,用的是一张不规则形状的图片来清除黑白图片,而刮刮卡效果,是通过画线的方式,线比较粗而已,来清除上面的灰色。
主要的不同是,刮刮卡效果最后需要自动擦除掉全部灰色,这里有两种方式。

第一种

使用 canvas 的 getImageData 方法,来获取 canvas 上的像素信息,这个方法返回的对象的 data 属性是一个一维数组,包含以 RGBA 顺序的数据,数据使用 0 至 255(包含)的整数表示,详细的可以看看 canvas 的像素操作。
用这个方法来判断有多少已经擦除掉了,也就是通过一个变量来记录有多少像素的RGBA的值是0,当变量的值超过某一个值时,就清除全部灰色。

代码在这里:

https://codepen.io/FEWY/pen/BOjmyg

第二种

就直接看移动了多少,鼠标移动时,会有一个变量进行自增运算,当这个变量,超过一定值时,就擦除全部灰色。

代码在这里

https://codepen.io/FEWY/pen/eLJeNv

注意:
第一种方式使用 getImageData 存在跨域问题,不过因为这个效果中,没有在canvas上画图片,而是设置canvas的 background 为一张图片,所以这个还没有影响,但是如果canvas上画了其他图片,就可能需要处理跨域的问题了。
使用 getImageData 能获取到 canvas 上的像素信息,就可以根据刮刮卡上灰色的面积,决定擦除全部灰色的时机,更加灵活。

第二种方式,虽然不存在跨域的问题,但是,不能很好的根据刮刮卡上灰色的面积,控制最后擦除全部灰色的时机。

感谢各位的阅读!关于“canvas中globalCompositeOperation属性的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: canvas中globalCompositeOperation属性的示例分析

本文链接: https://lsjlt.com/news/274715.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • canvas中globalCompositeOperation属性的示例分析
    这篇文章给大家分享的是有关canvas中globalCompositeOperation属性的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。说明最早知道 canvas 的 globalCompositeO...
    99+
    2023-06-14
  • canvas线条属性的示例分析
    这篇文章主要介绍了canvas线条属性的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、线条的帽子lineCap取值:butt(默认值),round圆头,squar...
    99+
    2023-06-09
  • HTML5新特性与Canvas常用属性的示例分析
    这篇文章主要介绍HTML5新特性与Canvas常用属性的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 1.HTML5的内容类型 内容类型 描述 内嵌 向文档中添加其他...
    99+
    2024-04-02
  • React中ref属性的示例分析
    这篇文章主要介绍了React中ref属性的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。概述首先,Refs 和 ref 是两个概念,Refs 是 React 提供的可...
    99+
    2023-06-15
  • Spring中Transactional属性的示例分析
    小编给大家分享一下Spring中Transactional属性的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、Transactional声明式事务管理...
    99+
    2023-06-15
  • mybatis属性的示例分析
    这篇文章给大家分享的是有关mybatis属性的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言MyBatis是基于“数据库结构不可控”的思想建立的,也就是我们希望数据库...
    99+
    2024-04-02
  • python属性的示例分析
    这篇文章主要介绍了python属性的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。属性(property)##不推荐 class&n...
    99+
    2024-04-02
  • C#中属性和特性的示例分析
    这篇文章主要介绍C#中属性和特性的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先要说的是,可能一些刚接触C#的朋友常常容易把属性(Property)跟特性(Attribute)弄混淆,其实这是两种不同的东...
    99+
    2023-06-17
  • css中will-change属性的示例分析
    这篇文章主要介绍了css中will-change属性的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。will-changeCSS 属...
    99+
    2024-04-02
  • CSS中mask-image属性的示例分析
    这篇文章给大家分享的是有关CSS中mask-image属性的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。CSS mask遮罩属性的历史非常久远了,远到比CSS3 bor...
    99+
    2024-04-02
  • css3中移动属性的示例分析
    这篇文章主要为大家展示了“css3中移动属性的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“css3中移动属性的示例分析”这篇文章吧。transform...
    99+
    2024-04-02
  • CSS中position属性sticky的示例分析
    这篇文章主要介绍了CSS中position属性sticky的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在开发移动端app时,经常会碰到需要这样一种情况 &...
    99+
    2023-06-08
  • Linux中线程属性的示例分析
    这篇文章主要为大家展示了“Linux中线程属性的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux中线程属性的示例分析”这篇文章吧。我们在调用pthread_create函数创建线...
    99+
    2023-06-15
  • CSS属性MASK的示例分析
    小编给大家分享一下CSS属性MASK的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!顾名思义,mask 译为遮罩。在 CSS 中,mask 属性允许使用者通过遮罩或者裁切特定区域的图片的方式来隐藏一个元素的部分或者...
    99+
    2023-06-08
  • CSS属性之定位属性的示例分析
    小编给大家分享一下CSS属性之定位属性的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!CSS的定位属性有三种,分别是绝对定位、相对定位、固定定位。posi...
    99+
    2023-06-08
  • css中font不同属性的示例分析
    这篇文章给大家分享的是有关css中font不同属性的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。   简写顺序:style-variant-weight-size/l...
    99+
    2024-04-02
  • Css技术中height属性的示例分析
    这篇文章主要介绍了Css技术中height属性的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、height1、height:10...
    99+
    2024-04-02
  • css中属性值继承的示例分析
    这篇文章主要介绍了css中属性值继承的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。继承:html元素可以从父元素那里继承一部分cs...
    99+
    2024-04-02
  • html5中布尔属性hidden的示例分析
    这篇文章主要介绍html5中布尔属性hidden的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实例被隐藏的段落:<p hidden>这个段落应该被隐藏...
    99+
    2024-04-02
  • Angular4中HTML属性绑定的示例分析
    小编给大家分享一下Angular4中HTML属性绑定的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!简介基本HTML属性...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作