Canvas-图片旋转

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


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

    其实canvas是提供了各种各样的接口去控制画布的,旋转有rotate()方法。
    其实这里的旋转并不是真的把这个画布旋转了,例如我ctx.rotate(Math.PI/2)旋转90°了。并不是说我们在页面上就会看到canvas旋转了90°。我们可以理解为其实canvas是有两个部分组成的,一个是肉眼看得到的画布,一个是用于操作的虚拟画布,我们所有在虚拟画布上的动作都会映射到真实画布中去。
    这样说可能很难理解,下面用图来解释一波。首先介绍一下rotate()方法先,它可以旋转画布,旋转点画布的原点,而画布的原点默认是左上角。


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

在这里我们可以看到我刚刚所说的虚拟的画布旋转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. 插入图片并移动


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

  1. 移动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)

  1. 旋转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)

  1. 插入图片并移动
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)

这样就大功告成了


  • 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。

这篇文章讲的只是在图片中心旋转,canvas-图片缩放教程。有写的不好或错误的地方,望指出

更多专业前端知识,请上 【猿2048】www.mk2048.com

Canvas-图片旋转相关推荐

  1. canvas图片旋转,图片base64编码,保存图片

    在一些业务场景中,常常需要前端对图片进行操作,这样可以将部分的性能压力转移到前端设备,有利于减小服务器压力,下面讲解前端怎么操作图片. 首先,对图片的操作都是依赖于canvas画布,这里对canvas ...

  2. 小程序canvas图片旋转

    <!-- 旋转图片canvas --><canvas canvas-id="camCacnvs" style="width:{{canvasWidth} ...

  3. IE下及标准浏览器下的图片旋转(二)—— Canvas(1)

    文章过长,一篇无法保存. IE下及标准浏览器下的图片旋转(一)--滤镜,CSS3 3. canvas canvas 是html5中的新标签,使用canvas之前我们先看下它的定义:<canvas ...

  4. IE下及标准浏览器下的图片旋转(二)—— Canvas(2)

    文章过长,一篇无法保存 IE下及标准浏览器下的图片旋转(二)-- Canvas(1) 同样,作为最后,我们使用使用jquery也为canvas写个旋转demo: javascript: $(funct ...

  5. html让图片自动旋转360,html5 canvas 360图片旋转制作抽奖转盘代码

    特效描述:html5canvas 360图片旋转 抽奖转盘代码.60图片旋转制作抽奖转盘代码 代码结构 1. HTML代码 var colors = ["#B8D430", &qu ...

  6. canvas实现图片旋转

    canvas实现图片旋转 前言 代码 前言 在上一篇实现了 canvas实现压缩图片.现在有需求变了,需要将图片旋转,旋转后正确的显示图片的位置(不能被其他元素遮住),等比例显示图片. 简单的实现如下 ...

  7. canvas在舞台上点击后图片旋转_Canvas-图片旋转

    众所周知canvas是位图,你可以在里面渲染你要的东西,不过你只能操作canvas的属性来进行编辑.就是说你并不能操作画进canvas的东西,例如我在canvas里添加一幅画,我现在想将那幅画移动10 ...

  8. 图片(旋转/缩放/翻转)变换效果(ccs3/滤镜/canvas)

    以前要实现图片的旋转或翻转,只能用ie的滤镜来实现,虽然canvas也实现,但ie不支持而且不是html标准. css3出来后,终于可以用标准的transform来实现变换,而canvas也已成为ht ...

  9. canvas签名图片旋转

    canvas签名图片旋转 前言 一.实现思路 二.详细代码 总结 前言 当使用canvas完成横屏签名功能时,最后签名图片需要旋转角度,保证图片横铺 一.实现思路 思路是重新创建应该canvas,将图 ...

  10. 移动端 canvas 横屏 签名 图片旋转

    学习与 前端实现电子签名 是通过原生canvas实现,我这篇是对其进行了改造,记录一下 效果图 组件 components/esign.vue <template><div styl ...

最新文章

  1. 通过三个直观步骤理解ROC曲线
  2. C#(asp.net)对字符串的操作公共类(StringUtil.cs)
  3. 玩聚的Blog墙 VIII
  4. Android之linux基础教学之七 中断下半部之软中断
  5. python deque的内在实现 本质上就是双向链表所以用于stack、队列非常方便
  6. java B2B2C Springboot电子商城系统
  7. 编码方法论,赋能你我他
  8. java 字符串 内存_java – 字符串文字和永久生成内存区域
  9. Spring: ConfigurationClassUtils类
  10. Python核心编程第二版 第十三章课后答案
  11. 工作中你都遇到哪些不要脸的同事?
  12. cisco交换机命令大全(10)
  13. 极域电子教室软件 v4.0 2015 豪华版忘记密码怎么办
  14. Gibberish 本地化插件学习
  15. Minecraft我的世界开服教程
  16. 网络传输介质有哪几种
  17. 数据结构课程设计【C++实现】
  18. RHEL4-ASU2-i386上安装oracle9204
  19. 从外包到拿下阿里 offer,这 2 年 5 个月 13 天到底发生了什么?
  20. Java 开发最容易写的 10 个bug

热门文章

  1. java的for循环取出数据只是拿到最后一个_新兴大数据分析榆中百合
  2. linux正则表达式脚本实例,PowerShell中正则表达式使用例子
  3. C语言实用算法系列之学生管理系统_单向链表外排序_堆内数组存储链表节点指针_函数指针+switch
  4. 传感与检测实验报告,差动变压器的特性测定,江南大学物联网自动化
  5. Verilog HDL中容易生成锁存器的两种情况
  6. hive选择mariadb还是mysql_Hive MariaDb的安装
  7. python关于文件的编程题_《Python编程》源代码文件
  8. vue - cli 脚手架安装
  9. NOIP模拟测试21「折纸·不等式」
  10. Html_Img元素 设置图片与其他元素横排高度一致