HTML5 <canvas> 标签用于绘制图像(通过脚本,通常是 JavaScript)。
不过,<canvas> 元素本身并没有绘制能力(它仅仅是图形的容器) - 您必须使用脚本来完成实际的绘图任务。
getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性。
本手册提供完整的 getContext("2d") 对象属性和方法,可用于在画布上绘制文本、线条、矩形、圆形等等。
浏览器支持
Internet Explorer 9、Firefox、Opera、Chrome 以及 Safari 支持 <canvas> 及其属性和方法。
注释:Internet Explorer 8 以及更早的版本不支持 <canvas> 元素。
颜色、样式和阴影
属性 | 描述 |
---|---|
fillStyle | 设置或返回用于填充绘画的颜色、渐变或模式 |
strokeStyle | 设置或返回用于笔触的颜色、渐变或模式 |
shadowColor | 设置或返回用于阴影的颜色 |
shadowBlur | 设置或返回用于阴影的模糊级别 |
shadowOffsetX | 设置或返回阴影距形状的水平距离 |
shadowOffsetY | 设置或返回阴影距形状的垂直距离 |
方法 | 描述 |
---|---|
createLinearGradient() | 创建线性渐变(用在画布内容上) |
createPattern() | 在指定的方向上重复指定的元素 |
createRadialGradient() | 创建放射状/环形的渐变(用在画布内容上) |
addColorStop() | 规定渐变对象中的颜色和停止位置 |
线条样式
属性 | 描述 |
---|---|
lineCap | 设置或返回线条的结束端点样式 |
lineJoin | 设置或返回两条线相交时,所创建的拐角类型 |
lineWidth | 设置或返回当前的线条宽度 |
miterLimit | 设置或返回最大斜接长度 |
矩形
方法 | 描述 |
---|---|
rect() | 创建矩形 |
fillRect() | 绘制“被填充”的矩形 |
strokeRect() | 绘制矩形(无填充) |
clearRect() | 在给定的矩形内清除指定的像素 |
路径
方法 | 描述 |
---|---|
fill() | 填充当前绘图(路径) |
stroke() | 绘制已定义的路径 |
beginPath() | 起始一条路径,或重置当前路径 |
moveTo() | 把路径移动到画布中的指定点,不创建线条 |
closePath() | 创建从当前点回到起始点的路径 |
lineTo() | 添加一个新点,然后在画布中创建从该点到最后指定点的线条 |
clip() | 从原始画布剪切任意形状和尺寸的区域 |
quadraticCurveTo() | 创建二次贝塞尔曲线 |
bezierCurveTo() | 创建三次方贝塞尔曲线 |
arc() | 创建弧/曲线(用于创建圆形或部分圆) |
arcTo() | 创建两切线之间的弧/曲线 |
isPointInPath() | 如果指定的点位于当前路径中,则返回 true,否则返回 false |
转换
方法 | 描述 |
---|---|
scale() | 缩放当前绘图至更大或更小 |
rotate() | 旋转当前绘图 |
translate() | 重新映射画布上的 (0,0) 位置 |
transform() | 替换绘图的当前转换矩阵 |
setTransform() | 将当前转换重置为单位矩阵。然后运行 transform() |
文本
属性 | 描述 |
---|---|
font | 设置或返回文本内容的当前字体属性 |
textAlign | 设置或返回文本内容的当前对齐方式 |
textBaseline | 设置或返回在绘制文本时使用的当前文本基线 |
方法 | 描述 |
---|---|
fillText() | 在画布上绘制“被填充的”文本 |
strokeText() | 在画布上绘制文本(无填充) |
measureText() | 返回包含指定文本宽度的对象 |
图像绘制
方法 | 描述 |
---|---|
drawImage() | 向画布上绘制图像、画布或视频 |
像素操作
属性 | 描述 |
---|---|
width | 返回 ImageData 对象的宽度 |
height | 返回 ImageData 对象的高度 |
data | 返回一个对象,其包含指定的 ImageData 对象的图像数据 |
方法 | 描述 |
---|---|
createImageData() | 创建新的、空白的 ImageData 对象 |
getImageData() | 返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据 |
putImageData() | 把图像数据(从指定的 ImageData 对象)放回画布上 |
合成
属性 | 描述 |
---|---|
globalAlpha | 设置或返回绘图的当前 alpha 或透明值 |
globalCompositeOperation | 设置或返回新图像如何绘制到已有的图像上 |
其他
方法 | 描述 |
---|---|
save() | 保存当前环境的状态 |
restore() | 返回之前保存过的路径状态和属性 |
createEvent() | |
getContext() | |
toDataURL() |
w3ch文档是上面的。
难点在于旋转中心的确定。
第一版代码:
<html> <head> <style type="text/css"> #img{ border: solid 1px red; width:500px; height:500px; position:relative; } #canvas_myimg{ position:absolute; top:50%; left:50%; } #myimg{ position:absolute; top:50%; left:50%; width:400; height:400; } </style> <script src="jquery-1.6.1.min.js"></script> <script language="javascript"> var width = 400; var height = 400; var changePx = 50; function center(){ $("#canvas_myimg").css({'margin-left':-width/2,'margin-top':-height/2}); } function rotate(arr){ var img = document.getElementById("myimg"); if(!img){return false;} n = (n == null) ? 0 : n; if(arr == 'left'){ n = (parseInt(n) + parseInt(3))%4; }else if(arr == 'right'){ n = (parseInt(n) + parseInt(1))%4; }else if(arr == 'reversal'){ n = (parseInt(n) + parseInt(2))%4; } img.setAttribute("step",n); //对IE浏览器使用滤镜旋转 if(document.all) { img.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation='+ n +')'; // 对现代浏览器写入HTML5的元素进行旋转: canvas }else{ var c = document.getElementById("canvas_myimg"); if(c == null){ img.style.visibility = 'hidden'; img.style.position = 'absolute'; c = document.createElement('canvas'); c.setAttribute("id",'canvas_myimg'); img.parentNode.appendChild(c); } var canvasContext = c.getContext('2d'); switch(n) { case 0 : canvasContext.rotate(0 * Math.PI / 180); canvasContext.drawImage(img, 0, 0 , width , height); break; case 1 : canvasContext.rotate(90 * Math.PI / 180); canvasContext.drawImage(img, 0, -height , width , height); break; case 2 : canvasContext.rotate(180 * Math.PI / 180); canvasContext.drawImage(img, -width, -height , width , height); break; case 3 : canvasContext.rotate(270 * Math.PI / 180); canvasContext.drawImage(img, -width, 0 , width , height); break; } center(); } } function change(arr){ var newWidth = 0; var newHeight = 0; if(arr == 'add'){ newWidth = parseInt(width) + parseInt(changePx); newHeight = parseInt(height) + parseInt(changePx); }else if(arr == 'multiple'){ newWidth = parseInt(width) - parseInt(changePx); newHeight = parseInt(height) - parseInt(changePx); } if(newWidth <= 700 && newHeight <= 700 && newWidth >= 100 && newHeight >= 100){ width = newWidth; height = newHeight; } rotate(0); } $(function(){ $("#myimg").css({'margin-left':-width/2,'margin-top':-height/2}); rotate(0); }) //$("#myimg").onload = function(){ //} </script> </head> <body> <div id="tool"> <a href="#" id="arr_left" onclick="rotate('left')">向左</a> <a href="#" id="arr_right" onclick="rotate('right')">向右</a> <a href="#" id="arr_reversal" onclick="rotate('reversal')">反转</a> <a href="#" id="add" onclick="change('add')">加大</a> <a href="#" id="multiple" onclick="change('multiple')">缩小</a> </div> <div id="img" class="img"> <img src="temp.jpg" alt="" id="myimg"/> </div> </body> </html>
朋友版本代码:
<html> <head> <style type="text/css"> .img { background: #8b91a2; width: 500px; height: 500px; position: relative; } .myimg { display: block; margin: auto auto; width: 300px; height: 300px; position: absolute; top: 50%; left: 50%; } .transimg { -webkit-transform: rotate(90deg); -moz-transform: rotate(90deg); -ms-transform: rotate(90deg); -o-transform: rotate(90deg); transform: rotate(90deg); } </style> </head> <body> <div id="tool"> <a href="#" class="left">向左</a> <a href="#" class="right">向右</a> <a href="#" class="arr_reversal">反转</a> <input id="btn1" type="button" value="放大" class="big"/> <input id="btn2" type="button" value="缩小" class="small"/> </div> <div id="img" class="img"> <img src="img/afour.png" alt="" id="myimg" class="myimg"/> </div> <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script> <script type="text/javascript"> $(function () { local(); var current = 0; //向右 $('.right').click(function () { current = (current + 90) % 360; $('.img').css('transform', 'rotate(' + current + 'deg)') }) //反转 $('.arr_reversal').click(function () { current = (current + 180) % 360; $('.img').css('transform', 'rotate(' + current + 'deg)') }) //向左 $('.left').click(function () { current = (current - 90) % 360; $('.img').css('transform', 'rotate(' + current + 'deg)') }) //获取外层大宽高 var divwidth = $('.img').width(); var divheight = $('.img').height(); //变大 $('.big').click(function () { var imgwidth = $('.myimg').width(); var imgheight = $('.myimg').height(); if (divheight - imgheight > 50 && divwidth - imgwidth > 50) { ImageSuofang(true); local(); } }) //变小 $('.small').click(function () { var imgwidth = $('.myimg').width(); var imgheight = $('.myimg').height(); if (imgheight >= 100 && imgwidth >= 100) { ImageSuofang(false); local(); } }) //变大变小的方法 function ImageSuofang(args) { var oImgwidth = $('.myimg').width(); var oImgheight = $('.myimg').height(); if (args) { $('.myimg').css('width', oImgwidth * 1.1) $('.myimg').css('height', oImgheight * 1.1) } else { $('.myimg').css('width', oImgwidth / 1.1) $('.myimg').css('height', oImgheight / 1.1) } } //定位 function local() { var width = $('.myimg').width(); var height = $('.myimg').height(); $('.myimg').css({'margin-left': -width / 2, 'margin-top': -height / 2}) } }); </script> </body> </html>
最终版代码:
<html> <head> <script type="text/javascript"> var canvas; var context; var image; var minWidth = 50; var minHeight = 50; var imgWidth = 100; var imgHeight = 100; var changeRate = 0.3; var maxWidth = 500; var maxHeight = 500; window.onload = function(){ image = document.getElementById("src_img"); canvas = document.getElementById("cg_img"); var x = canvas.width/2; var y = canvas.height/2; context = canvas.getContext("2d"); rotate(360); } function rotate(angle,oper){ if(oper != null){ var tempWidth = parseInt(imgWidth) + parseInt(oper) * parseInt(imgWidth * changeRate); var tempHeight = parseInt(imgHeight) + parseInt(oper) * parseInt(imgHeight * changeRate) imgWidth = tempWidth > maxWidth ? maxWidth : (tempWidth < minWidth ? minWidth : tempWidth); imgHeight = tempHeight > maxHeight ? maxHeight : (tempHeight < minHeight ? minHeight : tempHeight); } image.style.visibility = 'hidden'; var x = canvas.width/2; var y = canvas.height/2; context.clearRect(0,0,canvas.width,canvas.height); context.translate(x,y); context.rotate(Math.PI/180 * angle); context.translate(-x,-y); var z = (parseInt(canvas.width) - parseInt(imgWidth)) / 2; var h = (parseInt(canvas.height) - parseInt(imgHeight)) / 2; context.drawImage(image,z,h,imgWidth,imgHeight); } </script> </head> <body> <div id="tool"> <a href="#" id="arr_left" onclick="rotate(270)">向左</a> <a href="#" id="arr_right" onclick="rotate(90)">向右</a> <a href="#" id="arr_reversal" onclick="rotate(180)">反转 </a> <a href="#" id="add" onclick="rotate(360,1)">加大</a> <a href="#" id="multiple" onclick="rotate(360,-1)">缩小</a> </div> <img src = "temp.jpg" id="src_img"></img> <canvas id = "cg_img" width="500px" height="500px" style = "border: solid 1px red;">您的浏览器不支持canvas</canvas> </body> </html>
参考文章:
http://blog.csdn.net/xiaozhuxmen/article/details/50732038
关于旋转中心:
前两个参数确定旋转中心坐标
后两个参数确定图形的长和宽。
画图也是这样,学会使用数学思想,画回字,解方程得到各边的关系,让图片按你的想法显示。
HTML5 <canvas> 标签用于绘制图像(通过脚本,通常是 JavaScript)。
不过,<canvas> 元素本身并没有绘制能力(它仅仅是图形的容器) - 您必须使用脚本来完成实际的绘图任务。
getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性。
本手册提供完整的 getContext("2d") 对象属性和方法,可用于在画布上绘制文本、线条、矩形、圆形等等。
浏览器支持
Internet Explorer 9、Firefox、Opera、Chrome 以及 Safari 支持 <canvas> 及其属性和方法。
注释:Internet Explorer 8 以及更早的版本不支持 <canvas> 元素。
颜色、样式和阴影
属性 | 描述 |
---|---|
fillStyle | 设置或返回用于填充绘画的颜色、渐变或模式 |
strokeStyle | 设置或返回用于笔触的颜色、渐变或模式 |
shadowColor | 设置或返回用于阴影的颜色 |
shadowBlur | 设置或返回用于阴影的模糊级别 |
shadowOffsetX | 设置或返回阴影距形状的水平距离 |
shadowOffsetY | 设置或返回阴影距形状的垂直距离 |
方法 | 描述 |
---|---|
createLinearGradient() | 创建线性渐变(用在画布内容上) |
createPattern() | 在指定的方向上重复指定的元素 |
createRadialGradient() | 创建放射状/环形的渐变(用在画布内容上) |
addColorStop() | 规定渐变对象中的颜色和停止位置 |
线条样式
属性 | 描述 |
---|---|
lineCap | 设置或返回线条的结束端点样式 |
lineJoin | 设置或返回两条线相交时,所创建的拐角类型 |
lineWidth | 设置或返回当前的线条宽度 |
miterLimit | 设置或返回最大斜接长度 |
矩形
方法 | 描述 |
---|---|
rect() | 创建矩形 |
fillRect() | 绘制“被填充”的矩形 |
strokeRect() | 绘制矩形(无填充) |
clearRect() | 在给定的矩形内清除指定的像素 |
路径
方法 | 描述 |
---|---|
fill() | 填充当前绘图(路径) |
stroke() | 绘制已定义的路径 |
beginPath() | 起始一条路径,或重置当前路径 |
moveTo() | 把路径移动到画布中的指定点,不创建线条 |
closePath() | 创建从当前点回到起始点的路径 |
lineTo() | 添加一个新点,然后在画布中创建从该点到最后指定点的线条 |
clip() | 从原始画布剪切任意形状和尺寸的区域 |
quadraticCurveTo() | 创建二次贝塞尔曲线 |
bezierCurveTo() | 创建三次方贝塞尔曲线 |
arc() | 创建弧/曲线(用于创建圆形或部分圆) |
arcTo() | 创建两切线之间的弧/曲线 |
isPointInPath() | 如果指定的点位于当前路径中,则返回 true,否则返回 false |
转换
方法 | 描述 |
---|---|
scale() | 缩放当前绘图至更大或更小 |
rotate() | 旋转当前绘图 |
translate() | 重新映射画布上的 (0,0) 位置 |
transform() | 替换绘图的当前转换矩阵 |
setTransform() | 将当前转换重置为单位矩阵。然后运行 transform() |
文本
属性 | 描述 |
---|---|
font | 设置或返回文本内容的当前字体属性 |
textAlign | 设置或返回文本内容的当前对齐方式 |
textBaseline | 设置或返回在绘制文本时使用的当前文本基线 |
方法 | 描述 |
---|---|
fillText() | 在画布上绘制“被填充的”文本 |
strokeText() | 在画布上绘制文本(无填充) |
measureText() | 返回包含指定文本宽度的对象 |
图像绘制
方法 | 描述 |
---|---|
drawImage() | 向画布上绘制图像、画布或视频 |
像素操作
属性 | 描述 |
---|---|
width | 返回 ImageData 对象的宽度 |
height | 返回 ImageData 对象的高度 |
data | 返回一个对象,其包含指定的 ImageData 对象的图像数据 |
方法 | 描述 |
---|---|
createImageData() | 创建新的、空白的 ImageData 对象 |
getImageData() | 返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据 |
putImageData() | 把图像数据(从指定的 ImageData 对象)放回画布上 |
合成
属性 | 描述 |
---|---|
globalAlpha | 设置或返回绘图的当前 alpha 或透明值 |
globalCompositeOperation | 设置或返回新图像如何绘制到已有的图像上 |
其他
方法 | 描述 |
---|---|
save() | 保存当前环境的状态 |
restore() | 返回之前保存过的路径状态和属性 |
createEvent() | |
getContext() | |
toDataURL() |