资讯专栏INFORMATION COLUMN

万圣节动画-canvas像素点

tainzhi / 827人阅读

摘要:万圣节到了,写一个小例子了解一下画图方法,可以实现一些有趣的效果,动画实现。移动路径方法把路径移动到画布中指定点,不创建线条。实现初始画布显示文字万圣节快乐闪电打雷反转画布重置画布总结万圣节快乐

万圣节到了,写一个小例子了解一下canvas画图方法,canvas可以实现一些有趣的效果,动画实现。以一个简单的页面实现了解一下基础的画图方法。
原文链接

canvas可以实现一些有趣的效果,动画实现。以一个简单的页面实现了解一下基础的画图方法。

效果

万圣节快乐 ^_^

预备知识
let canvas = document.getElementById("canvas");
let context = canvas.getContext("2d");

## 开始路径

context.beginPath();

beginPath()方法在画布上开始一条绘制路径,或重置当前的路径。

移动路径
context.moveTo();

moveTo()方法把路径移动到画布中指定点,不创建线条。

添加线条
context.lineTo();

lineTo()方法添加一个新点,在画布中创建该点到指定点的线条。

画图drawImage
context.drawImage(image,x,y);

drawImage()方法可以在画布上绘制图像、画布或视频,也可以绘制图像的某些部分,增加/减少图像的尺寸。

获取像素数据
context.getImageData(x,y,width,height);

getImageData()方法可以获取画布imageData对象,该对象指定了矩形的像素数据。

在imageData对象中每个像素都存在rgba值,以数组形式存储在data属性中。

放回像素数据
context.putImageData(imageData,x,y);

putImageData()方法将获取的图像数据放回到画布上。

实现 html


## css

html,
body,
canvas {
    width: 100%;
    height: 100%;
    margin: 0;
}

.switch {
    position: absolute;
    top: 70%;
    right: 10%;
    width: 50px;
    height: 50px;
    border-radius: 50px;
    outline: none;
    cursor: pointer;
    animation: switch-animate alternate infinite ease 1s 0s;
}

@keyframes switch-animate {
    from {
        box-shadow: 0 0 30px #ece9c5;
    }

    to {
        box-shadow: 0 0 100px #eae5a7;
    }
}    

## js

(function () {

    class Halloween {
        constructor(id) {
            this.canvas = document.getElementById(id);
            this.ctx = this.canvas.getContext("2d");
            this.w = this.canvas.width;
            this.h = this.canvas.height;
            this.data = [];
        }

        //初始画布
        initDraw(img) {
            this.w = this.canvas.width = img.width;
            this.h = this.canvas.height = img.height;
            this.ctx.drawImage(img, 0, 0);
            this.data = this.ctx.getImageData(0, 0, this.w, this.h);
        }

        //显示文字
        drawText() {
            this.ctx.font = "60px Verdana";
            this.ctx.fillStyle = "#ffffff";
            this.ctx.fillText("万圣节快乐", 350, 280);
        }

        //闪电
        lightning() {
            let ctx = this.ctx;
            ctx.strokeStyle = "#fff";
            ctx.lineWidth = 2;
            ctx.beginPath();
            ctx.moveTo(800, 10);
            ctx.lineTo(600, 100);
            ctx.lineTo(500, 200);
            ctx.stroke();
            ctx.beginPath();
            ctx.moveTo(600, 100);
            ctx.lineTo(650, 170);
            ctx.stroke()
        }

        //打雷
        thunder() {
            let timer = Math.floor(800 * Math.random());
            this.reverse();
            this.lightning();
            this.drawText();
            setTimeout(() => {
                this.reset();
            }, timer);
        }

        //反转画布
        reverse() {
            let imgData = this.ctx.getImageData(0, 0, this.w, this.h);
            for (var i = 0, len = imgData.data.length; i < len; i += 4) {
                imgData.data[i] = 255 - imgData.data[i];
                imgData.data[i + 1] = 255 - imgData.data[i + 1];
                imgData.data[i + 2] = 255 - imgData.data[i + 2];
                imgData.data[i + 3] = 255;
            }
            this.ctx.putImageData(imgData, 0, 0);
        }

        //重置画布
        reset() {
            this.ctx.putImageData(this.data, 0, 0);
        }
    }
    let halloween = new Halloween("canvas");
    let canvas = document.getElementById("canvas");
    let ctx = canvas.getContext("2d");
    let img = new Image();
    img.src = "/images/halloween.png";
    img.onload = () => {
        halloween.initDraw(img);
    }

    document.getElementById("click").onclick = () => {
        halloween.thunder();
    }

})();

# 总结

万圣节快乐?

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92011.html

相关文章

  • JavaScript中的图片处理与合成(四)

    摘要:算法性能提升图片算法处理实质原理其实是遍历像素点,对像素点的值进行改造。而像素点的数量与图片的大小尺寸成正向指数级增长,因此适当的缩放图片源后再去处理,对性能的提升十分巨大。 引言: 本系列现在构思成以下4个部分: 基础类型图片处理技术之缩放、裁剪与旋转(传送门); 基础类型图片处理技术之图片合成(传送门); 基础类型图片处理技术之文字合成(传送门); 算法类型图片处理技术(传送门)...

    Coding01 评论0 收藏0
  • 【30分钟学完】canvas动画|游戏基础(extra1-1):美图我也行

    摘要:前言本文是接续系列教程的,主要是介绍颜色系统在中的应用。本来是与一起成文的,因为莫名其妙的字数限制只能分割放送了。提供可以获取画布上任何一个像素,并可以自由的操作他们。绘制指定的位置绘制对象的内容。 前言 本文是接续系列教程的extra1,主要是介绍颜色系统在canvas中的应用。 本来是与extra1一起成文的,因为segmentfault莫名其妙的字数限制bug只能分割放送了。 ...

    G9YH 评论0 收藏0
  • 【30分钟学完】canvas动画|游戏基础(extra1-1):美图我也行

    摘要:前言本文是接续系列教程的,主要是介绍颜色系统在中的应用。本来是与一起成文的,因为莫名其妙的字数限制只能分割放送了。提供可以获取画布上任何一个像素,并可以自由的操作他们。绘制指定的位置绘制对象的内容。 前言 本文是接续系列教程的extra1,主要是介绍颜色系统在canvas中的应用。 本来是与extra1一起成文的,因为segmentfault莫名其妙的字数限制bug只能分割放送了。 ...

    Hydrogen 评论0 收藏0

发表评论

0条评论

tainzhi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<