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弹性盒模型开发笔记(三)
Apr 26 HTML / CSS
使用CSS3美化HTML表单的技巧演示
May 17 HTML / CSS
详解CSS 3 中的 calc() 方法
Jan 12 HTML / CSS
CSS3下的渐变文字效果实现示例
Mar 02 HTML / CSS
HTML5 本地存储和内容按需加载的思路和方法
Apr 07 HTML / CSS
html5-websocket基于远程方法调用的数据交互实现
Dec 04 HTML / CSS
HTML5 input元素类型:email及url介绍
Aug 13 HTML / CSS
HTML5里的placeholder属性使用实例和美化显示效果的方法
Apr 23 HTML / CSS
HTML5 canvas基本绘图之绘制五角星
Jun 27 HTML / CSS
Canvas实现贝赛尔曲线轨迹动画的示例代码
Apr 25 HTML / CSS
canvas 绘图时位置偏离的问题解决
Sep 16 HTML / CSS
Html5移动端网页端适配(js+rem)
Feb 03 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 REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
php单例模式实现(对象只被创建一次)
2012/12/05 PHP
正则表达式搭配js轻松处理json文本方便而老古
2013/02/17 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
jQuery实现固定在网页顶部的菜单效果代码
2015/09/02 Javascript
深入理解bootstrap框架之入门准备
2016/10/09 Javascript
JS返回只包含数字类型的数组实例分析
2016/12/16 Javascript
关于axios返回空对象的问题解决
2017/04/04 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
微信小程序实现复选框效果
2018/12/28 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
微信小程序公用参数与公用方法用法示例
2019/01/09 Javascript
layui插件表单验证提交触发提交的例子
2019/09/09 Javascript
vue如何使用外部特殊字体的操作
2020/07/30 Javascript
[36:20]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.17
2020/12/18 DOTA
Python import自定义模块方法
2015/02/12 Python
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
python3编码问题汇总
2016/09/06 Python
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
Python视频爬虫实现下载头条视频功能示例
2018/05/07 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
python django框架中使用FastDFS分布式文件系统的安装方法
2019/06/10 Python
在vscode中配置python环境过程解析
2019/09/28 Python
PyQt5+python3+pycharm开发环境配置教程
2020/03/24 Python
Pandas实现一列数据分隔为两列
2020/05/18 Python
Pycharm中配置远程Docker运行环境的教程图解
2020/06/11 Python
Python实现一个简单的递归下降分析器
2020/08/01 Python
Django websocket原理及功能实现代码
2020/11/14 Python
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
Python里面如何实现tuple和list的转换
2012/06/13 面试题
消防安全宣传口号
2014/06/10 职场文书
员工趣味活动方案
2014/08/27 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书
MySQL数据库之内置函数和自定义函数 function
2022/06/16 MySQL