画布旋转后的图像裁剪 [英] Image crop after rotate by canvas
本文介绍了画布旋转后的图像裁剪的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个 html5 画布.我想在画布中绘制/旋转图像并且图像大小不会改变.我根据图像大小设置画布的宽度/高度.旋转图像时遇到问题.َ旋转图像后,红色三角形被裁剪.在下面的链接中,一个例子显示了这个问题.请帮忙.http://jsfiddle.net/zsh64/6ZsCz/76/
var canvas = document.getElementById("canvas");var ctx = canvas.getContext("2d");varangleInDegrees = 0;var image = document.createElement("img");image.onload = 函数 () {canvas.width = image.width;画布高度 = 图像高度;ctx.drawImage(image, 0,0);};image.src = "图片/旋转.png";$("#R").click(function () {角度角度 += 90;drawRotated(angleInDegrees);});$("#L").click(function () {角度角度 -= 90;drawRotated(angleInDegrees);});函数 drawRotated(degrees) {ctx.clearRect(0, 0, canvas.width, canvas.height);ctx.save();ctx.translate(canvas.width/2, canvas.height/2);ctx.rotate(度 * Math.PI/180);ctx.drawImage(image, -image.width/2, -image.width/2);ctx.restore();}
解决方案
如果旋转图像,则可以重新计算包含它所需的边界框.
此代码将采用宽度/高度/旋转角度并返回新的边界框大小:
function newSize(w,h,a){var rads=a*Math.PI/180;var c = Math.cos(rads);var s = Math.sin(rads);如果 (s <0) { s = -s;}如果 (c <0) { c = -c;}size.width = h * s + w * c;尺寸.高度 = h * c + w * s ;}
这是示例代码和小提琴:http://jsfiddle.net/m1erickson/h65yr/一个>
<头><link rel="stylesheet" type="text/css" media="all" href="css/reset.css"/><!-- 重置 css --><script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script><风格>#containerDiv{边框:1px纯红色;位置:绝对;顶部:100 像素;左:100像素;}#帆布{边框:1px纯绿色;}</风格><脚本>$(函数(){var canvas=document.getElementById("canvas");var ctx=canvas.getContext("2d");var imgWidth=200;var imgHeight=300;var size={width:imgWidth, height:imgHeight};无功旋转=0;var deg2Rad=Math.PI/180;变量计数1=0;变量计数2=0;var img=new Image();img.onload=function(){imgWidth=img.width;imgHeight=img.height;size={width:imgWidth, height:imgHeight};画();}img.src="https://dl.dropboxusercontent.com/u/139992952/stackoverflow/Rotate.png";函数绘制(){canvas.width=size.width;canvas.height=size.height;//计算画布的中心点var cx=canvas.width/2;var cy=canvas.height/2;var info=document.getElementById("info");info.innerHTML="画布尺寸:"+(count1++)+": "+cx+"/"+cy;//在新调整大小的画布中心绘制矩形ctx.clearRect(0,0,canvas.width,canvas.height);ctx.fillStyle="rgba(216,216,150,1.0)";ctx.translate(cx,cy);ctx.rotate(rotation * deg2Rad);ctx.drawImage(img,-imgWidth/2,-imgHeight/2);}document.getElementById("rotate").addEventListener("click", rotateClicked, false);函数rotateClicked(e){旋转+=30;画();}document.getElementById("resize").addEventListener("click", resizeClicked, false);函数 resizeClicked(e){旋转+=30;newSize(imgWidth,imgHeight,rotation);画();}函数 newSize(w,h,a){var rads=a*Math.PI/180;var c = Math.cos(rads);var s = Math.sin(rads);如果 (s <0) { s = -s;}如果 (c <0) { c = -c;}size.width = h * s + w * c;尺寸.高度 = h * c + w * s ;}});头部><身体><button id="rotate">旋转而不调整大小</button><button id="resize">调整大小</button><p id=信息></p><div id="containerDiv"><canvas id="canvas" width=400 height=400></canvas>