(1/2)Canvas的交互&存为图片-基本篇
前言
公司的产品同学看到朋友圈疯传的这张图后。一拍脑袋,决定做个H5版本的来推广一波。
需求如下:
- 文字变成可以点击的,而且还要能够变色(闪瞎有木有) 
- 中间的姓名换成用户的微信头像 
- 点击button后,将canvas的操作结果保存成图片,来现微信长按保存到本地的功能。 
难点总结:
- 页面元素canvas基本的api画到画布上(要解决显示自适应的问题); 
- 如何实现点击canvas,识别点击文字的对应位置; 
- 图片保存的api; 
canvas的基本绘制和自适应
代码部分请忽略css样式
canvas初始化
html
<canvas id="test"></canvas>var canvas = document.getElementById('test'),
        ctx = canvas.getContext('2d');js | canvas自适应方案
- 等比公式:设计图元素尺寸/设计图宽度 = 显示图元素尺寸/移动设备像素宽度; 
- 推导: 显示图元素尺寸 = 设计图元素尺寸*(移动设备像素宽度/设计图宽度); 
- 定义: rate= 移动设备像素宽度/设计图宽度; 
var width = document.documentElement.clientWidth,
    //自适应比率计算
    rate = (document.documentElement.clientWidth/ 960).toFixed(2),
    height = rate*1540,js | canvas面向对象的元素绘制方法
- 经由高人指点,将canvas内部的元素记录成一个个记录了颜色、大小、坐标、等属性的对象。 
- 这样可以将元素分为几类:简单几何图形(圆,矩形等)、文字、图片这几类; 
- 同类元素可以用相同的方法绘制(请务必get此技能) 
canvas绘制文字
baseColor = '#000';
//canvas文字对象
 var textArr = [
 {num:0, has_click: 0, worth:750000, x : 60, y : 50+60, fontSize : 25, text : '英雄联盟', color: baseColor,isEn : true },
 {num:1, has_click: 0, worth:750000, x : 310/3, y : 50+650/3, fontSize : 20, text : '守望先锋', color: baseColor }
 ];
//转为自适应文字对象
var getTextScope = function(textArr){
  var arr = [];
  textArr.forEach(function(item){
    item.x = item.x * rate;
    item.y = item.y * rate;
    item.fontSize = item.fontSize * rate;
    //计算文字对象在canvas中的触摸范围
    item.r = item.x + (item.isEn ? item.text.length / 2 : item.text.length) * item.fontSize;
    item.b = item.y + item.fontSize;
    arr.push(item);
  });
return arr;
};
var newArr = getTextScope(textArr);
//绘制文字方法
var fillTextArr = function(el, textArr){
  textArr.forEach(function(item){
    el.font = item.fontSize + 'px Microsoft Yahei Helvetica Neue  Helvetica, STHeiTi, Arial, sans-serif ';
    el.textAlign= 'left';
    el.textBaseline = 'top';
    el.fillStyle = item.color;
    el.fillText(item.text, item.x, item.y);
    //绘制文字的触摸识别范围(调试用)
    el.beginPath();
    el.rect(item.x, item.y, item.r - item.x, item.b - item.y);
    el.stroke();
  });
};
fillTextArr(canvas,newArr)canvas绘制图片
html
页面隐藏元素加载canvas所需要用到的img元素,也可以新建img对象来处理。
<footer class="footer">
  <div class="img-source hide">
    <img src="/images/avater.jpg" alt="" id="avater"/>
    <img src="/images/avater-bg_05.png" alt="" id="avaterBg"/>
    <img src="/images/3.jpg" alt="" id="img3"/>
    <img src="/images/21060715code_img.jpg" alt="" id="code"/>
    <img src="/images/canvas_tag.png" alt="" id="scan"/>
  </div>
</footer>js
绘制图片的函数
var drawImages = function(el, arr){
  arr.forEach(function(item){
   el.drawImage(document.getElementById(item.id), item.x * rate, item.y * rate, item.w * rate, item.h * rate);
  });
};
var avatar = [
        {id : 'avater', x : 106, y : 50+95, w : 340/3, h : 340/3},
        {id : 'avater', x : 106, y : 50+95, w : 340/3, h : 340/3},
        {id : 'avaterBg', x : 100, y : 50+90, w : 375/3, h : 366/3}
    ];
drawImages(ctx, avatar);canvas元素点击交互
js
item.r、item.b、item.x、item.y在上文var newArr = getTextScope(textArr);中已经获取;
//判断点击的点是否在范围内
var isInText = function(item, p){
        if(p.x > item.x && p.x < item.r && p.y > item.y && p.y < item.b) {
            return true;
        }else {
            return false;
        }
    };//获取元素所在区域范围的函数
var getEventPosition =  function(ev){
        var x, y;
        if (ev.layerX || ev.layerX == 0) {
            x = ev.layerX;
            y = ev.layerY;
        } else if (ev.offsetX || ev.offsetX == 0) { // Opera
            x = ev.offsetX;
            y = ev.offsetY;
        }
        return {x: x, y: y};
    };交互事件实例
canvas.addEventListener('click', function(e){
    //获取点击坐标
    var p = getEventPosition(e);
    //遍历欧判断是否点击到某元素
    newArr.forEach(function(item, i){
            //判断是否点击到元素进行分别操作
            if(isInText(item, p)){
                //点击到某元素的操作
            }
        });
}, false);现在介绍了canvas绘制的基础操作,下一节就会写到项目的实践部分。
(1/2)Canvas的交互&存为图片-基本篇的更多相关文章
- js实现svg图形转存为图片下载
		我们知道canvas画布可以很方便的js原生支持转为图片格式并下载,但是svg矢量图形则并没有这方面原生的支持.研究过HighChart的svg图形的图片下载机制,其实现原理大体是浏览器端收集SVG代 ... 
- js实现svg图形转存为图片下载[转]
		我们知道canvas画布可以很方便的js原生支持转为图片格式并下载,但是svg矢量图形则并没有这方面原生的支持.研究过HighChart的svg图形的图片下载机制,其实现原理大体是浏览器端收集SVG代 ... 
- H5 中html 页面存为图片并长按 保存
		最近接到的一个新需求:页面一个静态H5,中间有一页是输入信息,然后跳转到最后一页,自动将页面生成图片,用户可以长按图片保存到手机上. 展示一下最后一页的样子: 刚拿到这个需求,在网上看了很多文章,最普 ... 
- 图片采用base64压缩,可以以字符串的形式传送base64给服务端转存为图片
		(function () { var coverImage = document.querySelector('<div id="coverImage">file< ... 
- 将HTML5 Canvas的内容保存为图片借助toDataURL实现
		将HTML5 Canvas的内容保存为图片主要思想是借助Canvas自己的API - toDataURL()来实现,具体实现如下,感兴趣的朋友可以参考下哈,希望对你有所帮助 <html> ... 
- Canvas引入跨域的图片导致toDataURL()报错的问题的解决
		本文介绍了Canvas引入跨域的图片导致toDataURL()报错的问题的解决,分享给大家,具体如下: [场景] 用户打开网页,则请求腾讯COS(图片服务器)上的图片js代码.使用canvas绘图. ... 
- HTML5 Canvas 小例子 旋转的图片
		<一>CSS部分 @charset "utf-8"; *{ padding:; margin:; outline: none; } #canvas{ position: ... 
- PHP《将画布(canvas)图像保存成本地图片的方法》
		用PHP将网页上的Canvas图像保存到服务器上的方法 2014年6月27日 歪脖骇客 发表回复 8 在几年前HTML5还没有流行的时候,我们的项目经理曾经向我提出这样一个需求:让项目评审专家们在评审 ... 
- 使用的是html5的canvas将文字转换成图片
		当前功能的运用场景是:用户需要传文件给他人,在用户选择文件之后需要显示一个文件图标和所选文件的名称. 当前代码部分是摘自网上,但是已经忘记在什么地方获取的,如有侵权联系小弟后自当删除. 注意:必须在h ... 
随机推荐
- Chrome:查看HTTP请求的header信息
			1.打开Google浏览器Chrome,通过F12进入开发者工具,进入Network模块下,此时由于我们还没有进行任何HTTP请求,所以这个页面下还是空空如也 2.随便通过某个搜索引擎搜索一下,比如通 ... 
- JZ-057-二叉树的下一个结点
			二叉树的下一个结点 题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 题目链接: 二叉树的下一个结点 代 ... 
- jmeter 24个常用函数
			Jmeter_24个常用函数 JMeter提供了很多函数,如果能够熟练使用,可以为脚本带来很多方便. JMeter函数是一种特殊值,可用于除测试计划外的任何组件. 函数调用的格式如下所示:${__ ... 
- 矩池云助力科研算力免费上"云",让 AI 教学简单起来
			矩池云是一个专业的国内深度学习云平台,拥有着良好的深度学习云端训练体验,和高性价比的GPU集群资源.而且对同学们比较友好,会经常做一些大折扣的活动,最近双十一,全场所有的RTX 2070.Platin ... 
- 字符集编码(四):UTF
			在前面文章<字符集编码(中):Unicode>中我们聊了 Unicode 标准并提到其有三种实现形式:UTF-16.UTF-8 和 UTF-32,本篇我们就具体聊聊这三种 UTF 是怎么实 ... 
- ASP.NET Core框架探索(一)
			今天我们来结合源码来探究一下ASP.NET CORE Web框架的运行原理. 可以先整体看一下下面这张基于源码分析过程的一个总结大纲,包含各环节完成的关键步骤: 下面我们将一起来结合源码探索启动一个A ... 
- JavaScript面向对象—深入ES6的class
			JavaScript面向对象-深入ES6的class 前言 在前面一篇中主要介绍了JavaScript中使用构造函数+原型链实现继承,从实现的步骤来说还是比较繁琐的.在ES6中推出的class的关键字 ... 
- 华为三层交换机5700 DHCP配置
			交换机配置DHCP配置 1,交换机作DHCP Server『配置环境参数』1. PC1.PC2的网卡均采用动态获取IP地址的方式2. PC1连接到交换机的以太网端口0/1,属于VLAN10:PC2连接 ... 
- Spring 中的 bean线程安全性分析
			首先:Spring 中的 bean不是线程安全的 Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但 ... 
- Linux----虚拟机克隆、快照、删除、
			克隆 已经安装一台linux系统 还想要更多的,直接克隆CentOS即可 使用vm ware 的克隆操作 注意: 使用前先关闭目前已开启的虚拟机 快照 作用: 虚拟系统出现异常,需要回到原先的状态,此 ... 
