我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用Canvas怎么实现一个图片分割效果

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用Canvas怎么实现一个图片分割效果

本篇文章为大家展示了使用Canvas怎么实现一个图片分割效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

首先我们要初始化一些变量,比如图片的宽高,矩形的个数,剪切的尺寸等,然后再计算每个矩形的坐标,使用一个二重循环将矩形坐标保存在data中。每个矩形有个随机位移,这个位移也需要保存起来,存在randoms中。其中x,y表示canvas画布的坐标,x1,y1表示图片裁剪的坐标。

init: function (context, width, height, area, img) {            this.context = context;            this.img = img;            this.imgWidth = img[0].width;          //图片宽高            this.imgHeight = img[0].height;            this.index = 0;                       //当前图片序号            this.width = width;                  //画布宽高            this.height = height;            this.area = height/12;                     //小矩形长度            this.countX = width / this.area;             //水平和垂直方向小矩形个数            this.countY = height / this.area;            this.wx = this.imgWidth / this.countX;      //图片在小矩形中的宽高            this.wy = this.imgHeight / this.countY;            this.state = true;                   //图片状态,true表示未拆分            this.dataFlag = true;                //小矩形坐标状态,true表示未加上随机值            this.duration = 1000;                 //动画时间            this.duration2 = 1500;            this.startTime = 0;            this.data = [];                       //小矩形坐标信息            this.randoms = [];                    //位置随机值            //初始化矩形坐标            var x1 = 0, y1 = 0, x = 0, y = 0;            for (var i = 0; i < this.countY; i++) {                for (var j = 0; j < this.countX; j++) {                    context.drawImage(this.img[this.index], x1, y1, this.wx, this.wy, x, y, this.area, this.area);                    //储存矩形坐标                    this.data.push({                        x1: x1,                        y1: y1,                        x: x,                        y: y                    });                    //添加随机值                    this.randoms.push(random(-this.area, this.area));                    x1 += this.wx;                    x += this.area;                }                x1 = 0;                y1 += this.wy;                x = 0;                y += this.area;            }            this.checkMargin();        }

检测边缘

在给矩形添加位移之前我们需要判断一下位移后的坐标是否超过图片界限,比如在顶部的矩形如果是y轴移动,那么只能够向上移,判断的条件为当前坐标加上位移值是否小于0或大于图片的宽高。如果更新后的坐标小于0,那么这个随机值一定是负数,需要把随机值改为正数,如果大于图片高度,那么改成负数即可。由于每个矩形的移动都是在一个方向上移动,所以我这里写成偶数位移动x轴,奇数位移动y轴。

//检测边缘        checkMargin: function () {            var self = this;            this.data.forEach(function (item, index) {                if (index % 2 == 0) {  // 下标为2的倍数时移动x轴,否则移动y轴                    if ( item.x1 + self.randoms[index] < 0)                        // 改为正数                        self.randoms[index] = -self.randoms[index];                    if (item.x1 + self.wx + self.randoms[index] > self.imgWidth )                        // 改为负数                        self.randoms[index] = -Math.abs(self.randoms[index])                } else {                    if (item.y1 + self.randoms[index] < 0)                        self.randoms[index] = -self.randoms[index];                    if (item.y1 + self.randoms[index] + self.wy > self.imgHeight)                        self.randoms[index] = -Math.abs(self.randoms[index])                }            })        }

分离和复原

动画的内容的分离和复原就是更新矩形坐标的值,打乱内容只要将data里的坐标加上随机值,而复原就是减去随机值,

//检测边缘        checkMargin: function () {            var self = this;            this.data.forEach(function (item, index) {                if (index % 2 == 0) {  // 下标为2的倍数时移动x轴,否则移动y轴                    if ( item.x1 + self.randoms[index] < 0)                        // 改为正数                        self.randoms[index] = -self.randoms[index];                    if (item.x1 + self.wx + self.randoms[index] > self.imgWidth )                        // 改为负数                        self.randoms[index] = -Math.abs(self.randoms[index])                } else {                    if (item.y1 + self.randoms[index] < 0)                        self.randoms[index] = -self.randoms[index];                    if (item.y1 + self.randoms[index] + self.wy > self.imgHeight)                        self.randoms[index] = -Math.abs(self.randoms[index])                }            })        }

在储存好坐标后就可以去实现平移动画了,移动的过程有一个平滑的过渡,我们可以使用Tween.js的缓动算法,该算法有4个参数分别是当前时间,初始位置,结束位置,动画时间。详细内容可以参考张鑫旭的这篇文章https://www.zhangxinxu.com/wordpress/2016/12/how-use-tween-js-animation-easing/ 。通过Tween.js可以算出每一帧要移动的距离,然后再使用requestAnimationFrame去更新坐标。

blockAnimation: function () {            var flag = 1;            if (this.state) {  // 判断是打乱图片还是还原图片                this.update(true)            } else {                flag = -1;                this.update(false);            }            var self = this;            this.startTime = +new Date();  // 获取当前时间            this.state = !this.state;            (function animation() {                var t = +new Date();                if (t >= self.startTime + self.duration) {  // 动画结束条件                    return false;                }                self.data.forEach(function (item, index) {                    if (index % 2 == 0) {                        var pos = Math.tween.Expo.easeInOut(t - self.startTime, 0, self.randoms[index] * flag, self.duration);   // 计算出每帧移动的距离                        self.context.drawImage(self.img[self.index], item.x1 + pos, item.y1, self.wx, self.wy, item.x, item.y, self.area, self.area);                    } else {                        var pos = Math.tween.Expo.easeInOut(t - self.startTime, 0, self.randoms[index] * flag, self.duration);                          self.context.drawImage(self.img[self.index], item.x1, item.y1 + pos, self.wx, self.wy, item.x, item.y, self.area, self.area);                    }                });                requestAnimationFrame(animation);            })();        }

到这里就已经实现了分离和复原的动画了

使用Canvas怎么实现一个图片分割效果

图片切换

接下来开始处理图片切换的部分,这里跟轮播图有点像,轮播图动画是将每个图片位置移动可视窗口宽度的距离,这里也是一样,只要将坐标加上图片高度就可以实现y轴上的切换。和轮播图不一样的是,我们这里只有一个canvas标签,在切换时只需要改变当前图和下一张图的坐标,当前图移动距离为y1 + pos,下张图移动距离为y1 + pos - imgHeight(为什么要减imgHeight就不用说了吧)。

//垂直滑动动画        verticalAnimation: function (val) {            if (!this.time2) {                return false;            }            this.checkTime(2);            var self = this;            val ? val = 1 : val = -1;  //判断上滑还是下滑            if ((this.index + val) < 0 || (this.index + val) >= (this.img.length)) {   //判断图片序号是否到底                return false;            }            this.state ? this.update(true) : this.update(false);            this.startTime = +new Date();            (function animation() {                var t = +new Date();                if (t >= self.startTime + self.duration2) {                    val === 1 ? self.index++ : self.index--;  //调整图片顺序                    self.index < 0 ? self.index = self.img.length - 1 : self.index;                    self.index >= self.img.length ? self.index = 0 : self.index;                    return false;                }                self.data.forEach(function (item) {                    var pos = Math.tween.Cubic.easeInOut(t - self.startTime, 0, (self.imgHeight) * val, self.duration2);                    // 更新当前图片坐标                    self.context.drawImage(self.img[self.index], item.x1, item.y1 + pos, self.wx, self.wy, item.x, item.y, self.area, self.area);                    // 更新下张图片坐标                    self.context.drawImage(self.img[self.index + val], item.x1, item.y1 + pos - self.imgHeight * val, self.wx, self.wy, item.x, item.y, self.area, self.area);                });                requestAnimationFrame(animation);            })()        }

上述内容就是使用Canvas怎么实现一个图片分割效果,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用Canvas怎么实现一个图片分割效果

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Canvas怎么实现一个图片分割效果

本篇文章为大家展示了使用Canvas怎么实现一个图片分割效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先我们要初始化一些变量,比如图片的宽高,矩形的个数,剪切的尺寸等,然后再计算每个矩形的坐标
2023-06-09

使用canvas怎么实现一个图片马赛克效果

本篇文章为大家展示了使用canvas怎么实现一个图片马赛克效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. 原生canvas实现用到的API1) getContext(contextID) -
2023-06-09

使用AmazeUI怎么实现一个图片轮播效果

使用AmazeUI怎么实现一个图片轮播效果?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
2023-06-09

使用canvas怎么实现一个数字雨效果

使用canvas怎么实现一个数字雨效果?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。效果图:代码:
2023-06-09

使用canvas怎么实现一个github404动态效果

使用canvas怎么实现一个github404动态效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。文件目录文件资源文件源码与图片在文章末尾给出代码网页的body部分这里给
2023-06-09

使用canvas怎么实现一个流水灯效果

使用canvas怎么实现一个流水灯效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。具体内容如下 <
2023-06-15

使用canvas怎么实现一个探照灯效果

这期内容当中小编将会给大家带来有关使用canvas怎么实现一个探照灯效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
2023-06-09

使用CSS3怎么实现一个切片式图片轮播效果

使用CSS3怎么实现一个切片式图片轮播效果?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。css是什么意思css是一种用来表现HTML或XML等文件样式的计算机语
2023-06-08

使用CSS3怎么实现一个图片抽屉式效果

这篇文章将为大家详细讲解有关使用CSS3怎么实现一个图片抽屉式效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。HTML代码:
2023-06-08

使用canvas怎么实现一个图片打码功能

使用canvas怎么实现一个图片打码功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先创建一个html文件, 并引入 vue 和 elelment-ui(注
2023-06-09

使用canvas怎么实现一个手写签名效果

这期内容当中小编将会给大家带来有关使用canvas怎么实现一个手写签名效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。HTML代码:
2023-06-09

Python怎么实现位图分割的效果

这篇文章主要讲解了“Python怎么实现位图分割的效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python怎么实现位图分割的效果”吧!话不多说,直接来代码。import cv2impo
2023-06-25

使用canvas怎么实现一个下雨效果的示例

本篇文章为大家展示了使用canvas怎么实现一个下雨效果的示例,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
2023-06-09

使用canvas怎么实现一个扭蛋机动画效果

使用canvas怎么实现一个扭蛋机动画效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。布局扭蛋机的布局比较简单,只需要在基础背景上添加一些元素就可以,最主要的是canvas标
2023-06-09

使用css怎么实现一个幻灯片效果

本篇文章给大家分享的是有关使用css怎么实现一个幻灯片效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现方法:首先定义多张幻灯片元素;然后使用“@keyframes”规则和
2023-06-14

Android应用中怎么实现一个图片平铺效果

这期内容当中小编将会给大家带来有关Android应用中怎么实现一个图片平铺效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1)第一种利用系统提供的api实现Bitmap bitmap = BitmapF
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录