`

任意旋转图片的js实例

阅读更多
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>任意旋转图片</title>
<script type="text/javascript" src="coos.ui.rotate.js"></script>
</head>
<body>
	<div id="inner"><img id="theimage" border="0" src="logo.jpg" /></div>
	<div style="position:absolute;top:235px;height:40px;">
		<input type="button" value="<-Rotate逆时针" name="RotateL" id="RotateL" onclick="rotateRight('theimage',90);">
		<input type="button" value="顺时针Rotate->" name="RotateR" id="RotateR" onclick="rotateLeft('theimage',90);">
		<input type="button" value="顺时针270" name="RotateR" id="RotateR" onclick="rotateLeft('theimage',270);">
	</div>
</body>
</html>

 

function rotate(id,angle,whence) {
	var p = document.getElementById(id);

	// 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;
	}

	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);

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

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

		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;
		}

		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);

		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);
}

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

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

 

注:有个问题是gif动画图片在火狐下旋转后不会动的,在ie下正常。jpg图片没有问题。

 

图片旋转本身比较容易,但要在固定最大宽高上作旋转比较麻烦,要等比例改变图片的宽高,而且同样的缩放算法在ie和火狐下效果不一样,对于比例不规则的图片,要达到满意的效果很难搞。

 

分享到:
评论
8 楼 cloudgamer 2010-10-07  
我也写过类似的图片旋转效果
还可以翻转和缩放
7 楼 binlaniua 2010-01-31  
canvas.style.filter = "progid:DXImageTransform.Microsoft.Matrix(M11="+costheta+",M12="+(-sintheta)+",M21="+sintheta+",M22="+costheta+",SizingMethod='auto expand')"; 

看到这
FF悲剧了~
6 楼 鹤惊昆仑 2010-01-31  
楼主的代码来自jquery-rotate这个插件吧?see:http://code.google.com/p/jquery-rotate/ 。rotate这个函数还应该提供一个回调函数,每次旋转后触发一个事件,用户可以调整相关dom样式。

另外, canvas.oImage = new Image();canvas.oImage.src = p.src; 这两句里面有个隐藏很深的bug--firefox下图片未加载时context.drawImage会报错,应该改成 canvas.oImage = p;
5 楼 sorehead 2010-01-30  
Javaeye搞什么灰机
附件就是下载不了!!!
4 楼 zqding 2010-01-29  
不错的东西,学习一下
3 楼 zdz8207 2010-01-27  
一般用使用到的对象来做检测是最可靠的

你说的没错,基于功能的检测是最可靠的,不过有时候也会有问题,如果有同样的功能但实现方法不一样,返回的值不一样还是不能直接用的,浏览器的判断还是必要的。
要其他浏览器支持document.all估计不太可能,到那个时候估计现在写的代码早就没用了。

图片旋转本身比较容易,但要在固定最大宽高上作旋转比较麻烦,要等比例改变图片的宽高,而且同样的缩放算法在ie和火狐下效果不一样,对于比例不规则的图片,要达到满意的效果很难搞。
2 楼 cuixiping 2010-01-26  
不错。

我之前也写过一个图片360°旋转的动画,代码不知道哪去了。
基本上对于非IE,就是Canvas,对于IE则可以用滤镜或者VML来实现。

楼主判断IE用的是这句
if (document.all && !window.opera) {
我觉得可能不是很好,保不定其他浏览器什么时候也支持document.all了
一般用使用到的对象来做检测是最可靠的,对于本例:
可以检测是否支持style.filter
也可以检测是否支持canvas.getContext
1 楼 jackleaf 2010-01-25  
如果能带有缓动的效果旋转,这就是一个很有动感的特效了。不然动作就有点生硬。但是谢谢你的分享,让我们的思路更加开阔。

相关推荐

    js图片查看器。鼠标拖动图片任意方向旋转,鼠标滚动滚轮缩放,任意角度翻转。

    1. **图片旋转**:通过监听鼠标的移动事件,可以实现图片的任意方向旋转。用户只需按住鼠标拖动,图片就能跟随鼠标的移动轨迹旋转。这通常涉及到图像的矩阵变换,通过改变图片的旋转角度来实现。 2. **图片缩放**:...

    js 实例(页面弹出窗口、图片倒转等)

    在这个名为"js 实例(页面弹出窗口、图片倒转等)"的压缩包中,我们能看到一系列实用且有趣的JavaScript特效实现,非常适合开发者们学习和参考。这些实例涵盖了从基本的页面交互到复杂的视觉效果,让我们一一探讨。 ...

    程序天下:JavaScript实例自学手册

    4.5 鼠标放到图片上会显示另外一张图片 4.6 鼠标形状定义大全 4.7 鼠标移入移出时颜色变化 4.8 跟随鼠标的文字 4.9 跟随鼠标的彩色文字 4.10 跟随鼠标的魔法文字 4.11 跟随鼠标的星星 4.12 跟随鼠标的旋转背景 4.13 ...

    移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能

    移动端Vue+Vant的Uploader实现上传、压缩、旋转图片功能,是利用了Vue.js框架结合Vant UI组件库中的Uploader组件来实现的。该功能主要针对移动端用户,提供了便捷的图片上传、压缩及旋转处理。以下是一些相关知识点...

    《程序天下:JavaScript实例自学手册》光盘源码

    4.5 鼠标放到图片上会显示另外一张图片 4.6 鼠标形状定义大全 4.7 鼠标移入移出时颜色变化 4.8 跟随鼠标的文字 4.9 跟随鼠标的彩色文字 4.10 跟随鼠标的魔法文字 4.11 跟随鼠标的星星 4.12 跟随鼠标的旋转背景 4.13 ...

    JavaScript网页特效范例宝典源码

    实例236 在页面中旋转的图片 365 实例237 改变形状的图片 366 实例238 图片在页面浮动 367 实例239 随机变化的网页背景 369 8.5 选择头像 370 实例240 在列表中选择图片 370 实例241 在弹出的新窗口中选择图片 372 ...

    JS图片旋转代码,可以向左,向右90度转动.rar

    这个"JS图片旋转代码,可以向左,向右90度转动.rar"文件提供了一个基于JavaScript的解决方案,允许用户通过点击来实现图片90度的顺时针或逆时针旋转。以下是对这个知识点的详细讲解: 1. **HTML5 Canvas**: HTML5的...

    遮罩动画原理以及实例

    ##### 实例4:图片浏览效果 - **遮罩层**:使用一个矩形作为遮罩层,模拟图片预览窗口。 - **被遮罩层**:在遮罩层下方放置一系列图片。 - **动画效果**:通过移动遮罩层的位置,模拟浏览不同图片的效果。 ##### ...

    cropper.js图片裁剪

    它支持矩形和圆形裁剪,同时还允许用户在裁剪过程中自由旋转图片,极大地提升了用户体验。在前端开发中,尤其是在需要上传头像或者处理图像的应用场景下,`cropper.js` 是一个非常实用的工具。 1. **基本功能** `...

    jquery特效实例打包

    在"jquery特效实例"中,图片特效是不可或缺的一部分。jQuery可以实现图片轮播、图片预加载、鼠标悬停放大等效果。例如,使用`$.each()`遍历图片数组,配合定时器实现自动轮播;利用`hover()`事件处理函数,可以实现...

    cropper+layui实现图片裁剪、旋转、放大缩小后上传

    2. **图片旋转**:支持90度、180度、270度及任意角度的图片旋转。 3. **放大缩小**:用户可以平滑地放大或缩小图片以查看细节或调整裁剪区域。 4. **预览**:在裁剪过程中,可以实时预览裁剪结果。 5. **响应式设计*...

    asp.net 头像上传及预览剪裁实例源码

    上传并预览,用户可以任意选择区域,支持头像旋转 2.支持上传成功,js 回调函数 3.无论图片过大还是过小,都可以按照固定大小显示 4.支持亮度,对比度,饱和度修饰 5.支持头像拍照保存 6.支持php,asp,jsp 调用 7....

    cropper.js cropper.css Html使用

    3. **图片旋转**:可以自由地旋转图片,支持90度、45度等常见角度,也可以自定义旋转角度。 4. **预览与比例锁定**:用户可以预览裁剪结果,并锁定纵横比,确保裁剪后的图片保持原始比例。 5. **事件监听**:提供了...

    3D自动旋转城市地图(湖南)区域柱图显示;echarts解决方案附所有代码;可以更换成任意省市

    在本项目中,我们探讨的是如何使用Echarts这个强大的前端数据可视化库来创建一个3D自动旋转的城市地图,其中特定的区域用3D柱图表示。这个解决方案特别适用于展示地域性数据,例如湖南各地区的统计数据,同时用户也...

    wx_sticker:微信小程序实现的图片拖拽,旋转,缩放(按住一个角)

    本项目“wx_sticker”就是这样一个实例,它利用JavaScript技术,为用户提供了图片操作的基本功能,包括贴纸的叠加、删除、单指移动以及通过按住一个角进行的缩放和旋转。虽然这个Demo没有实现完整的边缘判断和使用...

    vc++ 开发实例源码包

    内含(重启、图片操作、ip操作、键盘与鼠标、客户端以及服务端、文件传输等实例源码) 多个VC++加密解密算法库(CRYPT++) 详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加...

    js轮播图之旋转木马效果

    本文实例为大家分享了js轮播图之旋转木马效果的具体代码,供大家参考,具体内容如下 思路:给定一个数组,储存每张图片的位置,旋转将位置进行替换 左旋转:将数组第一个数据删除,然后添加到数组的最后 右旋转:将...

    JAVA上百实例源码以及开源项目源代码

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...

    daycaca一款基于canvas图片处理类库它可以帮助你处理图片的压缩裁剪等

    2. 创建实例:在JavaScript中创建Daycaca对象,并指定用于显示图片的canvas元素。 3. 调用方法:使用对象的方法,如compress()进行图片压缩,crop()进行图片裁剪,然后可以通过toDataURL()获取处理后的图片数据URL...

Global site tag (gtag.js) - Google Analytics