快捷搜索:

js落成图片旋转的两种办法

作者: w88官方网站手机版  发布:2019-09-16

两个alert()分别显示为:[object Object]和[object HTMLCanvasElement]。从这里,不难看出,$("#jb51")并没有像我预想的那样。再用firebug调试看一下,
$("#jb51")和document.getElementById("jb51")倒底是什么内容。调试结果如下:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>jb51</title>
<link href="css/index.css" rel="stylesheet" type="text/css">
<script src="js/jquery-1.4.2.min.js" type="text/javascript"></script>
</head>
<body>
<div class="warp">
<canvas id="jb51"></canvas>
</div>
<script>
var canvas_jb51=$("#jb51");
alert(canvas_jb51);
alert(document.getElementById("jb51"));
var jb51_2d=canvas_jb51.getContext("2d");
var jb51_img=new Image();
jb51_img.src="images/Boston-III-48px.png";
jb51_2d.drawImage(jb51_img,0,0);
</script>
</body>
</html>

<span ...>
<rvml:group class="rvml"...>
<rvml:image class="rvml".../>
</rvml:group>
</span>

$("#jb51") [canvas#jb51]
document.getElementById("jb51") canvas#jb51

两个alert()分别显示为:[object Object]和[object HTMLCanvasElement]。从这里,不难看出,$("#jb51")并没有像我预想的那样。再用firebug调试看一下,
$("#jb51")和document.getElementById("jb51")倒底是什么内容。调试结果如下:

function rotateLeft(id,angle) {
rotate(id,angle==undefined?-90:-angle);
}
$("#input1").click(function(){
$("img.imgRotate").attr("id","imgRotate");
rotateLeft("imgRotate",90);
$("#imgRotate").attr("top","50%");
$("#imgRotate").attr("left","50%");
$("#imgRotate").attr("margin","-50px 0 0 -50px");
});
</script>
</html>

想必,看到这里,不用我说,大家也会想到结果了。
实际上,$("#jb51")[0]等同于 document.getElementById("jb51")

复制代码 代码如下:

复制代码 代码如下:

复制代码 代码如下:

$("#jb51") [canvas#jb51]
document.getElementById("jb51") canvas#jb51

<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
#div1 {
width: 800px;
height: 600px;
background-color: #ff0;
position: absolute;
}
.imgRotate {
width: 100px;
height: 100px;
position: absolute;
top: 50%;
left: 50%;
margin: -50px 0 0 -50px;
}
#imgRotate {
width: 100px;
height: 100px;
position: absolute;
top: 50%;
left: 50%;
margin: -50px 0 0 -50px;
}
</style>
</head>
<body>
<div id="div1">
<img id="img1" class="imgRotate" src="" />
<input id="input1" type="button" value="btn1"></input>
</div>
</body>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript">
function rotate(id,angle,whence) {
var p = document.getElementById(id);

复制代码 代码如下:

复制代码 代码如下:

canvas.src = p.src;
canvas.height = p.height;
canvas.width = p.width;

在今天写一个canvas的小程序时,才发现这两者是不一样的。

在今天写一个canvas的小程序时,才发现这两者是不一样的。

示例代码:

直接用alert()来显示这两个方法倒底获得的是什么。代码如下:

直接用alert()来显示这两个方法倒底获得的是什么。代码如下:

查看这三种方法的代码会发现,本质上是一种解决方案:chrome下使用canvas对象实现,ie8下使用VML或者Matrix()或BasicImage()实现。本人近期改造一个组件:其中涉及到旋转、放大图片,由于jQueryRotate.js在ie8下会生成一个新的对象,导致放大图片前选择图片时,需要进行特殊处理。后决定对chrome、ie8分开处理,chrome下使用jQueryRotate实现,ie8下使用BasicImage()实现,保证了代码的简洁性和可读性。

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>jb51</title>
<link href="css/index.css" rel="stylesheet" type="text/css">
<script src="js/jquery-1.4.2.min.js" type="text/javascript"></script>
</head>
<body>
<div class="warp">
<canvas id="jb51"></canvas>
</div>
<script>
var canvas_jb51=$("#jb51");
alert(canvas_jb51);
alert(document.getElementById("jb51"));
var jb51_2d=canvas_jb51.getContext("2d");
var jb51_img=new Image();
jb51_img.src="images/Boston-III-48px.png";
jb51_2d.drawImage(jb51_img,0,0);
</script>
</body>
</html>

想必,看到这里,不用我说,大家也会想到结果了。
实际上,$("#jb51")[0]等同于 document.getElementById("jb51")

3 使用Microsoft提供的BasicImage对象

您可能感兴趣的文章:

  • document.getElementById获取控件对象为空的解决方法
  • js中document.getElementByid、document.all和document.layers区分介绍
  • document.getElementById介绍
  • document.getElementById的简写方式(获取id对象的简略写法)
  • document.getElementById方法在Firefox与IE中的区别
  • document.getElementById为空或不是对象的解决方法
  • 各浏览器对document.getElementById等方法的实现差异解析

直接用alert()来显示这两个方法倒底获得的是什么。代码如下: 复制代码 代码如...

if (document.all && !window.opera) {
var canvas = document.createElement('img');

测试结果:chrome下效果正常,旋转后img对象仍为img对象;ie8下效果正常,但旋转后img对象变为下面对象,由于对象变化,若旋转后仍按原来方法获取img对象,则会报js错误。欲获取image对象,可根据class获取。如果图像旋转后,不进行其它操作,则可用此方法。若进行其它操作,如放大、缩小图像,则此方法实现较复杂。

function rotateRight(id,angle) {
rotate(id,angle==undefined?90:angle);
}

canvas.style.filter = "progid:DXImageTransform.Microsoft.Matrix(M11=" costheta ",M12=" (-sintheta) ",M21=" sintheta ",M22=" costheta ",SizingMethod='auto expand')";
} else {
var canvas = document.createElement('canvas');
if (!p.oImage) {
canvas.oImage = new Image();
canvas.oImage.src = p.src;
} else {
canvas.oImage = p.oImage;
}

2 使用Microsoft提供的Matrix对象

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ";
<html xmlns=";
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<img id="image" src="" />
<input id="input2" type="button" value="btn2"></input>
</body>
<script type="text/javascript" src="jquery.min.js"></script>

复制代码 代码如下:

示例代码:

var context = canvas.getContext('2d');
context.save();
if (rotation <= Math.PI/2) {
context.translate(sintheta*canvas.oImage.height,0);
} else if (rotation <= Math.PI) {
context.translate(canvas.width,-costheta*canvas.oImage.height);
} else if (rotation <= 1.5*Math.PI) {
context.translate(-costheta*canvas.oImage.width,canvas.height);
} else {
context.translate(0,-sintheta*canvas.oImage.width);
}
context.rotate(rotation);
context.drawImage(canvas.oImage, 0, 0, canvas.oImage.width, canvas.oImage.height);
context.restore();
}
canvas.id = p.id;
canvas.angle = p.angle;
p.parentNode.replaceChild(canvas, p);
}

复制代码 代码如下:

1 使用jQueryRotate.js实现

if (p.angle >= 0) {
var rotation = Math.PI * p.angle / 180;
} else {
var rotation = Math.PI * (360 p.angle) / 180;
}
var costheta = Math.cos(rotation);
var sintheta = Math.sin(rotation);

// we store the angle inside the image tag for persistence
if (!whence) {
p.angle = ((p.angle==undefined?0:p.angle) angle) % 360;
} else {
p.angle = angle;
}

使用jQueryRotate.js实现 示例代码: 复制代码 代码如下: !DOCTYPE html html head title/title style type="text/css" #div1 { width: 800px; height: 600px; background-co...

<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
#div1 {
width: 800px;
height: 600px;
background-color: #ff0;
position: absolute;
}
.imgRotate {
width: 100px;
height: 80px;
position: absolute;
top: 50%;
left: 50%;
margin: -40px 0 0 -50px;
}
</style>
</head>
<body>
<div id="div1">
<img id="img1" class="imgRotate" src="" />
<input id="input2" type="button" value="btn2"></input>
</div>
</body>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="jQueryRotate.js"></script>
<script type="text/javascript">
var num = 0;
$("#input2").click(function(){
num ;
$("#img1").rotate(90*num);
});
</script>
</html>

测试结果:chrome下不能旋转;ie8下效果正常,旋转后img对象仍为img对象。BasicImage()仅一个参数。

示例代码:

<script type="text/javascript">
var num = 0;
$("#input2").click(function(){
num = (num 1) % 4;
document.getElementById('image').style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' num ')';
});
</script>
</html>

复制代码 代码如下:

测试结果:chrome下效果正常,但旋转后img对象变为canvas对象;ie8下效果正常,旋转后img对象仍为img对象。Matrix()参数较多,使用时需较多计算。

canvas.style.width = canvas.width = Math.abs(costheta*canvas.oImage.width) Math.abs(sintheta*canvas.oImage.height);
canvas.style.height = canvas.height = Math.abs(costheta*canvas.oImage.height) Math.abs(sintheta*canvas.oImage.width);

本文由www.w88985.com发布于w88官方网站手机版,转载请注明出处:js落成图片旋转的两种办法

关键词: www.w88985.c