html5 Canvas实现图片旋转的示例


Posted in HTML / CSS onJanuary 15, 2018

众所周知canvas是位图,你可以在里面渲染你要的东西,不过你只能操作canvas的属性来进行编辑。就是说你并不能操作画进canvas的东西,例如我在canvas里添加一幅画,我现在想将那幅画移动10px,我们并不能直接操作那幅画,因为我们根本获取不到那幅画的任何信息。我们永远只能获取到的是canvas对象。

那问题来了,我要怎么旋转图片

其实canvas是提供了各种各样的接口去控制画布的,旋转有rotate()方法。

其实这里的旋转并不是真的把这个画布旋转了,例如我ctx.rotate(Math.PI/2)旋转90°了。并不是说我们在页面上就会看到canvas旋转了90°。我们可以理解为其实canvas是有两个部分组成的,一个是肉眼看得到的画布,一个是用于操作的虚拟画布,我们所有在虚拟画布上的动作都会映射到真实画布中去。

这样说可能很难理解,下面用图来解释一波。首先介绍一下rotate()方法先,它可以旋转画布,旋转点画布的原点,而画布的原点默认是左上角。

html5 Canvas实现图片旋转的示例

下面在给大家看一下旋转45°所呈现的效果:

html5 Canvas实现图片旋转的示例

在这里我们可以看到我刚刚所说的虚拟的画布旋转45°后再向虚拟的画布内插入图片,然后真实画布所呈现的就是虚拟画布和真实画布相交的部分了。这里可能不太好理解,大家仔细想想。

两张图的代码是这样的:

// 未旋转
var img = document.getElementById('img')
var canvas = document.getElementById('canvas')
var ctx = canvas.getContext("2d")
ctx.drawImage(img, 0, 0)
// 逆时针旋转45°
var img = document.getElementById('img')
var canvas = document.getElementById('canvas')
var ctx = canvas.getContext("2d")
ctx.rotate(-Math.PI / 4);
ctx.drawImage(img, 0, 0)

看到这里我想大家基本知道rotate()的使用方法了。

下面就来说说怎么实现再图片中心旋转

再说之前向给大家了解一下canvas的另外两个方法的用法:

ctx.translate(x, y): 这个方法是可以移动画布原点的方法,参数分别是x,y;

ctx.drawImage(img, x, y):这个方法上面用过了,不过里面是有三个参数的,第一个是要插入的图片dom,后面两个x,y分别为插入图片时对img的位置进行修改。

从图可以看出,要想实现围绕图片中心旋转45°,就得把canvas的原点移动到这张图的中心,再旋转canvas,再就是插入图片时将图片往左上角平移图片自身的一半。

这里分别有三个步骤:

  1. 移动canvas原点
  2. 旋转canvas
  3. 插入图片并移动

html5 Canvas实现图片旋转的示例 

下面把这三个步骤分开看看(图片的宽高为400和300)

移动canvas原点

var img = document.getElementById('img')
var canvas = document.getElementById('canvas')
var ctx = canvas.getContext("2d")
ctx.translate(200, 150)
ctx.drawImage(img, 0, 0)

html5 Canvas实现图片旋转的示例

旋转canvas

var img = document.getElementById('img')
var canvas = document.getElementById('canvas')
var ctx = canvas.getContext("2d")
ctx.translate(200, 150)
ctx.rotate(-Math.PI / 4)
ctx.drawImage(img, 0, 0)

html5 Canvas实现图片旋转的示例

插入图片并移动

var img = document.getElementById('img')
var canvas = document.getElementById('canvas')
var ctx = canvas.getContext("2d")
ctx.translate(200, 150)
ctx.rotate(-Math.PI / 4)
ctx.drawImage(img, -200, -150)

html5 Canvas实现图片旋转的示例

这样就大功告成了

ps:大家再做完一系列动作后一定要将canvas的原点,旋转复原。不然再经过一系列操作后,canvas的设置会乱掉。每操作一次完成后都把设置恢复回原样就好了。

var img = document.getElementById('img')
var canvas = document.getElementById('canvas')
var ctx = canvas.getContext("2d")
ctx.translate(200, 150)         // 1
ctx.rotate(-Math.PI / 4)        // 2
ctx.drawImage(img, -200, -150)
// 恢复设置(恢复的步骤要跟你修改的步骤向反)
ctx.rotate(Math.PI / 4)         // 1
ctx.translate(-200, -150)       // 2
// 之后canvas的原点又回到左上角,旋转角度为0
// 其它操作...

还有一点要注意的,我刚刚示范的是图片相对canvas x轴y轴为0所示范的例子,如果不为0的情况下,只需在移动原点的时候ctx.translate(200+x, 150+y)。这里的200和150是该图片的宽高的一半,x,y就是图片相对canvas的x,y

这篇文章讲的只是在图片中心旋转,之后我会写旋转搭配图片的缩放。有写的不好或错误的地方,望指出

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3 icon font完全指南(CSS3 font 会取代icon图标)
Jan 06 HTML / CSS
一款恶搞头像特效的制作过程 利用css3和jquery
Nov 21 HTML / CSS
使用css3实现的tab选项卡代码分享
Dec 09 HTML / CSS
CSS3 text-shadow实现文字阴影效果
Feb 24 HTML / CSS
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
Jan 31 HTML / CSS
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
Apr 24 HTML / CSS
html5的自定义data-*属性与jquery的data()方法的使用
Jul 02 HTML / CSS
深入剖析HTML5 内联框架iFrame
May 04 HTML / CSS
简述Html5 IphoneX 适配方法
Feb 08 HTML / CSS
HTML实现代码雨源码及效果示例
Feb 25 HTML / CSS
HTML5 通过Vedio标签实现视频循环播放的示例代码
Aug 05 HTML / CSS
CSS三大特性继承性、层叠性和优先级详解
Jan 18 HTML / CSS
详解html5页面 rem 布局适配方法
Jan 12 #HTML / CSS
详解html5 canvas 微信海报分享(个人爬坑)
Jan 12 #HTML / CSS
利用三角函数在canvas上画虚线的方法
Jan 11 #HTML / CSS
HTML5 Web缓存和运用程序缓存(cookie,session)
Jan 11 #HTML / CSS
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
Jan 10 #HTML / CSS
基于canvas使用贝塞尔曲线平滑拟合折线段的方法
Jan 10 #HTML / CSS
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
Jan 10 #HTML / CSS
You might like
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
2019/06/03 PHP
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
2006/09/22 Javascript
借用Google的Javascript API Loader来加速你的网站
2009/01/28 Javascript
js中定义一个变量并判断其是否为空的方法
2014/05/13 Javascript
详解JavaScript语法对{}处理的坑爹之处
2014/06/05 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
2015/12/03 Javascript
ajax实现动态下拉框示例
2017/01/10 Javascript
BootStrap 标题设置跨行无效的解决方法
2017/10/25 Javascript
微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析
2017/11/27 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
2018/03/26 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
2018/12/11 jQuery
原生js实现获取form表单数据代码实例
2019/03/27 Javascript
es6 super关键字的理解与应用实例分析
2020/02/15 Javascript
js实现简单进度条效果
2020/03/25 Javascript
使用vant的地域控件追加全部选项
2020/11/03 Javascript
初学Python实用技巧两则
2014/08/29 Python
使用Python横向合并excel文件的实例
2018/12/11 Python
Python简单基础小程序的实例代码
2019/04/28 Python
Win下PyInstaller 安装和使用教程
2019/12/25 Python
pyqt5 textEdit、lineEdit操作的示例代码
2020/08/12 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
法律专业个人实习自我鉴定
2013/09/23 职场文书
培训讲师邀请函
2014/01/10 职场文书
人力资源专员岗位职责
2014/01/30 职场文书
父亲的菜园教学反思
2014/02/13 职场文书
工作岗位说明书模板
2014/05/09 职场文书
重点工程汇报材料
2014/08/27 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
颐和园导游词400字
2015/01/30 职场文书
交心谈心活动总结
2015/05/11 职场文书
教师节简报
2015/07/20 职场文书
学困生帮扶工作总结
2015/08/13 职场文书
pytorch显存一直变大的解决方案
2021/04/08 Python
Python机器学习之决策树和随机森林
2021/07/15 Javascript