css3和canvas的旋转效果的一些详解

之前遇到的一个老问题啦,突然发现又傻傻分不清楚啦。。。来总结一下吧,哈哈。先来说一下,为什么要把这两者放在一起说,先上需求:如何把反着的一张图片弄正,并输出出来呢?

这个需求来源于手机照相机照出的图片其实存起来的时候对于程序显示来说不都是正的,我们自己在手机上浏览看起来是正的是因为手机的程序帮我们搞定啦,可是当我们拿到手机原始图片的时候想展示的时候发现,矣?怎么有的反正的,其实照相机照相的时候会留下照片的方向信息,根据这些方向信息我们就可以把照片调正过来,然后再存到服务器或者展示出来,关于照片里的方向信息大家可以去参考EXIF.js这个库,我总结的信息如下:(EXIF信息有1 8 3 6)

1: 正向
8: 需要逆时针旋转90
3: 需要旋转180度
6: 需要顺时针旋转90
好了,有了这些信息我们来看看怎么去做呢? 比如有张图是需要旋转90度才能扶正的,那写css3的rotate的不就行了么?是啊,我最初也是这种感觉,可是这样有诸多限制,比如,如果你想把图片存在服务端,下次别人用的时候图片就是正的了,就不用再做特殊处理了啊,那得图像处理下,前端怎么弄呢?canvas应该可以吧!本以为可以像css3那样两行搞定:

transform: rotate(90deg); 
transform-origin: center;
可是绕了很久才发现不行啊,发现两者是有区别的:

css3是基于图形自身的位置为坐标系进行变换的
canvas有画布的概念,是基于画布坐标系进行变换的
额。。我说完也觉得一脸懵逼,其实我觉得很多概念和感觉对于普通开发者来讲都不是灵感带来的,都是不断试验和思考带来的,所以如果我做不了特斯拉,那我向爱迪生靠近些也是好的,那么动手吧!

例子如下:其中用了三种不同的方式解决,每种方式都可以达到效果,但其实是不一样的,可以注意下每种方式最后留下的坐标系原点在哪里,是的,条条大路通罗马。例子中请按button得先后顺序点击实验,要不然会乱的,因为对顺序有依赖额。。觉得内嵌看得太小的话,可以点击这里点我 特别注意的就是:css3都是基于自身位置的变换,而canvas变换的是坐标系

关键源码如下:

var canvas = document.getElementById('canvas'); 
var img = new Image(); 
img.src = './test.jpeg'; 
img.onload = function() { 
    var cts = canvas.getContext("2d");
        canvas.width = this.naturalHeight;
        canvas.height = this.naturalWidth;
        cts.clearRect(0, 0, canvas.width, canvas.height);
        cts.fillStyle = "#000";
        cts.fillRect(0, 0, canvas.width, canvas.height);
//坐标系变换
        cts.translate(canvas.width/2, canvas.height/2);
        cts.rotate(90*Math.PI/180);

//@way1, 移动坐标系的原点
    cts.translate(-canvas.height/2, -canvas.width/2);
    cts.drawImage(img, 0, 0);

//@way2,改变图的开始取值点
//cts.drawImage(img, -canvas.height/2, -canvas.width/2);

/** 还有什么办法吗? **/
//cts.rotate(90*Math.PI/180);
//cts.drawImage(img, 0, -canvas.width);
}

时间: 2024-09-10 17:16:47

css3和canvas的旋转效果的一些详解的相关文章

[Canvas前端游戏开发]——FlappyBird详解

一直想自己做点小东西,直到最近看了本<HTML5游戏开发>,才了解游戏开发中的一点点入门知识. 本篇就针对学习的几个样例,自己动手实践,做了个FlappyBird,源码共享在度盘 :也可以参考github,里面有更多的游戏样例. 游戏截图 HTML5之Canvas Canvas是Html5中用于绘图的元素,它可以绘制各种图形,比如长方形,多边形,圆形等等.如果想要了解Canvas的使用可以参考: http://www.w3school.com.cn/tags/html_ref_canvas.a

CSS3伪类选择器:nth-child()用法详解

CSS3的出现无疑给前端开发人员带来了巨大的优势,今天我们着重介绍CSS3中一个新出现的强大伪类选择器:nth:child():为了方便大家理解,我今天会通过展示曾经做过的项目页面,让大家直观清晰的了解这一伪类选择器的功能和使用技巧   1.首先大家了解下该伪类的语法法:       :nth-child(an+b) ps:可惜的是该伪类选择器不支持ie浏览器,当要兼容ie浏览器的时候,我们只有每一个li给它们添加类名了 2.这是我们要实现的页面效果   步骤一: 先写好html代码 <div

HTML5 canvas 9绘制图片实例详解_javascript技巧

绘制图片 Var image=new Image(); image.src=" http://img4.duitang.com/uploads/item/201406/25/20140625182321_4MTau.thumb.700_0.jpeg"; image.onload=function(){} Context.drawImage(image,x,y); Context.drawImage(image,x,y,w,h); Context.drawIamge(image,sx,s

CSS3中-webkit-overflow-scrolling: touch 的使用方法详解

我们一起来看一篇关于 css中-webkit-overflow-scrolling: touch 手动改变 scrollTop 导致的 bug 及解决方案,希望此解决方案能够帮助到各位同学. 关于-webkit-overflow-scrolling,看看相关API,主要用来设置在IOS浏览器的容器内滚动是否开启惯性和回弹的. 所以,一般情况都是设置其值为touch的 -webkit-overflow-scrolling: touch 但是,这一次遇到一个BUG. 我的需求是需要手动设置滚动高度的

ss教程:CSS3 Media Queries 详解

说起CSS3的新特征,就不得不提到MediaQueries. 本文比力细致,所以良多隐真顶用不到.所以若是只是想简略领会MediaQueries,保举参考CSS3MediaQueries. CSS2.1界说了Media的部门,包罗类型.组别战法则等.CSS并非为了显示器而创造,而是使用于各类各样的,好比常见的显示器,越来愈多的手持设施,可能略显过期的电视机等等. css教程:CSS3 Media Queries 详解,css3教程,css3教程而MediaQueries的引入,其作用就是答应增添

CSS3圆角详解

CSS3是样式表(style sheet)语言的最新版本,它的一大优点就是支持圆角. 网页设计大师Nicholas Zakas的最新文章,清晰易懂地解释了CSS3圆角的各个方面,非常值得学习.以下就是我翻译的中文版. ========================================= CSS3圆角详解 作者:Nicholas Zakas 译者:阮一峰 原文:http://msdn.microsoft.com/en-us/scriptjunkie/gg508841.aspx 发表日

HTML5 canvas绘制雪花飘落动画(需求分析、知识点、程序编写分布详解)

原文:HTML5 canvas绘制雪花飘落动画(需求分析.知识点.程序编写分布详解) 看到网上很多展示html5雪花飞动的效果,确实非常引人入胜,我相信大家也跟我一样看着心动的同时,也很好奇,想研究下代码如何实现:虽然哦很多地方也能下载这些源码,不过也不知道别人制作此类动画时的思路及难点分析. 我这几天刚好学习了一下,也趁着此刻有时间从需求分析.知识点.程序编写一步步给大家解剖下,要是在各位关公面前耍大刀了,可别见笑哟. 最终效果图如下: 图1 一.需求分析 1.圆形雪花 本示例中雪花形状使用圆

《Web前端开发精品课——HTML5 Canvas开发详解》——第一部分第二章节

第2章 直线图形 2.1 直线图形简介 在Canvas中,基本图形有两种:①直线图形:②曲线图形.Canvas常见的直线图形有三种,分另是直线.矩形.多边形. 这一章我们先来学习Canvas中的直线图形. 2.2 直线 2.2.1 Canvas坐标系 在学习Canvas之前,我们先来介绍一下Canvas中的坐标系是如何使用的.了解Canvas使用的坐标系是学习Canvas的最基本的前提. 我们经常见到的坐标系是数学坐标系,而Canvas使用的坐标系是W3C坐标系,这两种坐标系唯一的区别在于y轴正

Canvas 制作动态进度加载水球详解及实例代码_javascript技巧

Canvas 动态进度加载水球 前言 之前看到一些球型的动态加载的效果,一直想自己动手做一个,正好这段时间重温了一个Canvas,所以就尝试了一下. 实现思路 关于水波的实现,使用了sin()函数,通过每一帧不断的移动sin()函数曲线,实现水波动态效果.然后,通过绘制圆形路径,进行clip(),实现球型效果. sin()函数相关 这里说一下sin()函数的相关基础,对于绘制水波的影响. 看一下图,回顾一下中学sin()函数的基础. 从图中可以看出,当函数为sin(x)时,值域为[-1, 1],