canvas旋转图片


<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>canvas旋转图片</title>
<style>
* {
box-sizing: border-box;
} .container {
margin: 15px;
border: 1px solid rgb(106, 250, 255);
padding: 20px;
background: #fff;
text-align: center;
} .img-block {
max-width: 400px;
background: #eee;
padding: 15px;
margin: 0 auto 15px auto;
} .img {
display: block;
max-width: 100%;
} .btn {
padding: 5px 10px;
}
</style>
</head> <body>
<div class="container">
<div class="img-block">
<img src="i.jpg" class="img" id="img">
</div>
<div class="operate-block">
<button type="button" class="btn" id="rotate_clockwise" onclick="rotateImage('img');">顺时针旋转90度</button>
<button type="button" class="btn" id="rotate_anticlockwise">逆时针旋转90度</button>
</div>
</div> <script>
/*
imageId: 需要旋转的图片的id;
direction: 顺时针为1, 逆时针为 - 1; 思路:
1. 获取需要旋转图片image的src;
2. 以此src构建新的图片对象img;
3. 在img的onload事件中:
1. 创建一个canvas元素, 它的宽和高分别对应img的高和宽( 因为旋转90度后, 图片的宽高正好是之前的高宽)
其中ctx我们可以想象它无限大,注意一点:ctx上绘制的图形只有位置出现在canvas窗口中时,才能显示出来
2. 绘制图片之前, 一定要先将ctx顺时针旋转90度,( 否则图片没有旋转的效果,因为绘制图片时的ctx状态已被保存下来),但是,绘制出来的图形效果相当于先绘制,再旋转
(那到底绘制在哪里,ctx旋转90度则正好全部显示在canvas上?)
我们可以将canvas的(0,0)位置当作一个圆心,而ctx就是围绕这个圆心旋转的。
我们倒推一下,image顺时针旋转90度后的形状,iamge的左下角成了新图的左上角,且这个左上角位置就在canvas的(0,0)处,ctx旋转时,这个角应该是不动的
这样我们只要得出image左上角的坐标就是我们需要寻找的ctx绘图时的起点:
左上角坐标(相对canvas来说)应该是(0, -canvas.width);
3.如果ctx不旋转,那么绘制出的新图正好在canvasde正上方,我们是看不见的;当ctx旋转90度之后,则新图正好处在canvas视窗中,完美呈现(这里我们需要想象一下:canvas大小位置固定,它是用来呈现绘制的图形的窗口;而ctx则是无限大,但是它的起点位置永远都是相对于canvas视窗的左上角,即ctx就是一个以canvas左上角为圆心,半径无限大的圆)
4.其他几个角度,原理一样
5.如果角度不是90度的倍数时,则绘图原点就需要使用sin,cos来表示了;
*/ function rotateImage(imageId, direction) {
var image = document.getElementById(imageId);
var src = image.src; var img = new Image();
img.src = src;
img.onload = function() {
var w = this.naturalWidth;
var h = this.naturalHeight; var canvas = document.createElement("canvas");
canvas.height = w;
canvas.width = h;
var ctx = canvas.getContext("2d");
ctx.rotate(Math.PI / 180 * 90);
ctx.drawImage(this, 0, -canvas.width);
var base = canvas.toDataURL("image/jpeg");
image.src = base;
} }
</script>
</body> </html>

最新文章

  1. matlab下二重积分的蒙特卡洛算法
  2. awk 用法(使用入门)
  3. NOIP 考前 数据结构复习
  4. Atitit usrQBM2331 参数格式化规范
  5. jpa OneToMany
  6. Android实战--短信发送器
  7. 【HDOJ】【3480】Division
  8. c++异常 连续抛出异常
  9. [转]教大家如何打造使用Tcpview(tcp查看器
  10. Spring3中用注解直接注入properties中的值
  11. jQuery节点操作,jQuery插入节点,jQuery删除节点,jQuery Dom操作
  12. hdu 4630 No Pain No Game 线段树离线处理
  13. Knockout快速扫盲
  14. 【笨木头Lua专栏】基础补充04:迭代器初探
  15. Python基础之模块、数据类型及数据类型转换
  16. Xcode部分快捷键
  17. Django更新后的配置修改
  18. spring的Java配置入门(Spring Boot学习笔记之一)
  19. (jQuery知识点整理-含有选择器)
  20. Flask+SQLAlchemy+alembic+Flask-RESTful使用

热门文章

  1. 使用Ajax获取多选框用户选择的值问题
  2. Python3.6爬虫+Djiago2.0+Mysql --运行djiago环境
  3. springboot导入excel到mysql
  4. 给自己立下一个flag先
  5. JDK源码阅读--Object
  6. 07_jQuery对象初识(五)事件(非常重要)
  7. 关于LZO无法平台上压缩,但是数据需要使用平台压缩的问题解决
  8. HTML5定位功能,实现在百度地图上定位
  9. 如何使用log4j记录日志
  10. NVIDIA驱动安装、CUDA安装、cudnn安装