canvas设置背景颜色 设置的宽高为什么都被解析为0了

&详细内容请点击&1.HTML Canvas API有两方面优势可以弥补:首先,不需要将所绘制图像中的每个图元当做对象存储,因此执行性能非常好;其次,在其他编程语言现有的优秀二维绘图API的基础上实现Canvas API相对来说比较简单。2.在网页上使用canvas元素时,它会创建一块矩形区域。默认情况下该矩形区域宽为300像素,高为150像素,但也可以自定义具体的大小或者设置canvas元素的其他特性。复制代码1 &body& 2 &div& 3 &header& 4 &h1&index&/h1& 5 &/header& 6 &nav& 7 &p&&a href="//"&Home&/a&&/p& 8 &p&&a href="//contact"&Contact&/a&&/p& 9 &/nav& 10 11 &div& 12 &canvas id="game"&&/canvas& 13 &/div& 14 15 &footer& 16 &p&& Copyright by Administrator&/p& 17 &/footer& 18 &/div& 19 &/body&复制代码3.canvas是行内元素复制代码1 &!DOCTYPE HTML& 2 &html& 3 &head& 4 &meta http-equiv="Content-Type" content="text/ charset=utf-8"& 5 &title&无标题文档&/title& 6 &style& 7 #game { 8 9 border-radius:10 10 -moz-border-radius:10 11 -webkit-border-radius:10 12 width:500 13 height:500 14 margin:0 auto 15 } 16 &/style& 17 &/head& 18 19 &body& 20 &canvas id="game"&&/canvas& 21 &canvas id="game"&&/canvas& 22 &/body& 23 &/html&复制代码显示在同一行,由此不难发现canvas是行内元素。4.CSS和canvas同大多数HTML元素一样,canvas元素也可以通过应用CSS的方式来增加边框,设置内边距、外边距等,而且一些CSS属性还可以被canvas内的元素继承。比如字体样式,在canvas内添加的文字,其样式默认同canvas元素本身是一样的。此外,在canvas中为context设置属性同样要遵从CSS语法。例如,对context应用颜色和字体样式,跟在任何HTML和CSS文档中使用的语法完全一样。5.在所有浏览器中,只有Internet Explorer不支持HTML5 Canvas。如果需要在Internet Explorer中使用canvas,可以选择使用名为explorercanvas的开源项目。使用explorercanvas时,需要先判断当前浏览器是否是Internet Explorer,如果是则在页面中嵌入script标签来加载explorercanvas。写法如下:1 &head& 2 &!--[if IE]&&script src="excanvas.js"&&/script&&![endif]--& 3 &/head&6.通过传入&2d&来获取一个二维上下文,这也是到目前为止唯一可用的上下文。提示 规范未来的某个版本中可能会增加对三维上下文的支持。7.对上下文的很多操作都不会立即反映到页面上。beginPath、moveTo以及lineTo这些函数都不会直接修改canvas的展示结果。canvas中很多用于设置样式和外观的函数也同样不会直接修改显示结果。只有当对路径应用绘制(stroke)或填充(fill)方法时,结果才会显示出来。8.圆形绘制。调用方法:context.arc(100, 100, 50, 0, 1/2*Math.PI, true);参数依次表示:圆心x坐标,圆心y坐标,半径,开始弧度,结束弧度,顺时针还是逆时针(true表示逆时针,false表示顺时针)。1/2Math.PI表示1/4圆的弧度。9.变换(缩放、平移、旋转等)可以像目前主流图像编辑工具那样支持实时图像处理,所以API中这部分内容的复杂性是必要的。复制代码1 &!DOCTYPE HTML& 2 &html lang="en"& 3 &head& 4 &meta charset="utf-8"& 5 &meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"& 6 &title&未命名文件&/title& 7 &script& 8 function drawDiagonal() { 9 var canvas = document.getElementById('diagonal'); 10 var context = canvas.getContext('2d'); 11 // 保存当前绘图状态 12 context.save(); 13 // 向右下方移动绘图上下文 14 context.translate(70, 140); 15 // 以原点为起点,绘制与前面相同的线段 16 context.beginPath(); 17 context.moveTo(0, 0); 18 context.lineTo(70, -70); 19 context.stroke(); 20 // 恢复原有的绘图状态 21 context.restore(); 22 } 23 window.addEventListener("load", drawDiagonal, true); &/script& 24 &/head& 25 26 &body& 27 &canvas id="diagonal" width="200" height="200"& &/canvas& 28 &/body& 29 &/html& 30 &/body& 31 &/html&复制代码10.closePath。这个函数的行为同lineTo很像,唯一的差别在于closePath会将路径的起始坐标自动作为目标坐标。closePath还会通知canvas当前绘制的图形已经闭合或者形成了完全封闭的区域,这对将来的填充和描边都非常有用。11.描边。复制代码1 // 加宽线条 2 context.lineWidth = 4; 3 // 平滑路径的接合点 4 context.lineJoin = 'round'; 5 // 将颜色改成棕色 6 context.strokeStyle = '#663300'; 7 // 最后,绘制树冠 8 context.stroke();复制代码也可以把lineJoin属性设置成bevel或者miter(相应的context.miterLimit值也需要调整)来变换拐角样式。lineCap,可以把它的值设置为butt、square或者round,以此来指定线条末端的样式。12.strokeRect和clearRect。strokeRect的作用是基于给出的位置和坐标画出矩形的轮廓,clearRect的作用是清除矩形区域内的所有内容并将它恢复到初始状态,即透明色。在HTML5 Canvas API中,canvas的清除矩形功能是创建动画和游戏的核心功能。如果希望创建运行起来比较流畅的动画,就需要使用剪裁(clipping)功能了,有可能还需要二次缓存canvas,以便最小化由于频繁的清除动作而导致的画面闪烁。13.绘制曲线。复制代码1 &!DOCTYPE HTML& 2 &html lang="en"& 3 &head& 4 &meta charset="utf-8"& 5 &meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"& 6 &title&未命名文件&/title& 7 &script& 8 function drawDiagonal() { 9 var canvas = document.getElementById('diagonal'); 10 var context = canvas.getContext('2d'); 11 // 保存canvas的状态并绘制路径 12 context.save(); 13 context.translate(100,100); 14 context.beginPath(); 15 // 第一条曲线向右上方弯曲 16 context.moveTo(0, 0); 17 context.quadraticCurveTo(170, -50, 260, -190); 18 // 第二条曲线向右下方弯曲 19 context.quadraticCurveTo(310, -250, 410,-250); 20 // 使用棕色的粗线条来绘制路径 21 //context.lineTo(100,100); 22 context.strokeStyle = '#663300'; 23 context.lineWidth = 3; 24 context.stroke(); 25 // 恢复之前的canvas状态 26 context.restore(); 27 } 28 window.addEventListener("load", drawDiagonal, true); &/script& 29 &/head& 30 31 &body& 32 &canvas id="diagonal" width="200" height="200"& &/canvas& 33 &/body& 34 &/html& 35 &/body& 36 &/html&复制代码第二组是指曲线的终点。第一组代表控制点(control point)。所谓的控制点位于曲线的旁边(不是曲线之上),其作用相当于对曲线产生一个拉力。通过调整控制点的位置,就可以改变曲线的曲率。HTML5 Canvas API的其他曲线功能还涉及bezierCurveTo、arcTo和arc函数。这些函数通过多种控制点(如半径、角度等)让曲线更具可塑性。14.在canvas中插入图片。在canvas中显示图片非常简单。可以通过修正层为图片添加印章、拉伸图片或者修改图片等,并且图片通常会成为canvas上的焦点。用HTML5 Canvas API内置的几个简单命令可以轻松地为canvas添加图片内容。不过,图片增加了canvas操作的复杂度:必须等到图片完全加载后才能对其进行操作。浏览器通常会在页面脚本执行的同时异步加载图片。如果试图在图片未完全加载之前就将其呈现到canvas上,那么canvas将不会显示任何图片。复制代码1 &!DOCTYPE HTML& 2 &html lang="en"& 3 &head& 4 &meta charset="utf-8"& 5 &title&未命名文件&/title& 6 &style& 7 #diagonal { 8 /style& 11 &script& 12 window.onload=function(){ 13 var canvas = document.getElementById('diagonal'); 14 var context = canvas.getContext('2d'); 15 // 加载图片bark.jpg 16 var bark = new Image(); 17 bark.src = "/templets/default/images/logo.jpg"; 18 // 图片加载完成后,将其显示在canvas上 19 bark.onload=function(){ 20 context.drawImage(bark, 5, 50, 100, 50); 21 } 22 } 23 &/script& 24 &/head& 25 26 &body& 27 &canvas id="diagonal" width="200" height="200"& &/canvas& 28 &/body& 29 &/html&复制代码从上面的代码中可以看到,我们为bark.jpg图片添加了onload处理函数,以保证仅在图像加载完成。除了图片本身外,还指定了x、y、width和height参数。这些参数会对贴图进行调整。我们还可以把原图的尺寸传进来,以便在裁切区域内对图片进行更多控制。15.渐变。使用渐变需要三个步骤:(1) 创建渐变对象;(2) 为渐变对象设置颜色,指明过渡方式;(3) 在context上为填充样式或者描边样式设置渐变。要设置显示哪种颜色,在渐变对象上使用addColorStop函数即可。这个函数允许指定两个参数:颜色和偏移量。颜色参数是指开发人员希望在偏移位置描边或填充时所使用的颜色。偏移量是一个0.0到1.0之间的数值,代表沿着渐变线渐变的距离有多远。除了可以变换成其他颜色外,还可以为颜色设置alpha值(例如透明),并且alpha值也是可以变化的。为了达到这样的效果,需要使用颜色值的另一种表示方法,例如内置alpha组件的CSS rgba函数。复制代码1 &!DOCTYPE HTML& 2 &html lang="en"& 3 &head& 4 &meta charset="utf-8"& 5 &title&未命名文件&/title& 6 &style& 7 #diagonal { 8 /style& 11 &script& 12 window.onload=function(){ 13 var canvas = document.getElementById('diagonal'); 14 var context = canvas.getContext('2d'); 15 context.translate(100,100); 16 // 创建用作树干纹理的三阶水平渐变 17 var trunkGradient = context.createLinearGradient(-5, -50, 50, -50); 18 // 树干的左侧边缘是一般程度的棕色 19 trunkGradient.addColorStop(0, '#663300'); 20 // 树干中间偏左的位置颜色要淡一些 21 trunkGradient.addColorStop(0.4, '#996600'); 22 // 树干右侧边缘的颜色要深一些 23 trunkGradient.addColorStop(1, '#552200'); 24 // 使用渐变色填充树干 25 context.fillStyle = trunkG 26 context.fillRect(-5, -50, 50, 100); 27 // 接下来,创建垂直渐变,以用作树冠在树干上投影 28 var canopyShadow = context.createLinearGradient(0, -50, 50, 100); 29 // 投影渐变的起点是透明度设为50%的黑色 30 canopyShadow.addColorStop(0, 'rgba(0, 0, 0, 0.5)'); 31 // 方向垂直向下,渐变色在很短的距离内迅速渐变至完全透明,这段长度之外的树干上没有投影 32 canopyShadow.addColorStop(0.2, 'rgba(0, 0, 0, 0.0)'); 33 // 在树干上填充投影渐变 34 context.fillStyle = canopyS 35 context.fillRect(-5, -50, 50, 100); 36 } 37 &/script& 38 &/head& 39 40 &body& 41 &canvas id="diagonal" width="200" height="200"& &/canvas& 42 &/body& 43 &/html&复制代码除了我们刚才用到的线性渐变以外,HTML5 Canvas API还支持放射性渐变,所谓放射性渐变就是颜色会介于两个指定圆间的锥形区域平滑变化。放射性渐变和线性渐变使用的颜色终止点是一样的。createRadialGradient(x0, y0, r0, x1, y1, r1)代码中,前三个参数代表以(x0,y0)为圆心,r0为半径的圆,后三个参数代表以(x1,y1)为圆心,r1为半径的另一个圆。渐变会在两个圆中间的区域出现。16.背景图。复制代码1 &!DOCTYPE HTML& 2 &html lang="en"& 3 &head& 4 &meta charset="utf-8"& 5 &title&未命名文件&/title& 6 &style& 7 #diagonal { 8 background:#ccc 9 } 10 &/style& 11 &script& 12 window.onload=function(){ 13 var canvas = document.getElementById('diagonal'); 14 var context = canvas.getContext('2d'); 15 // 加载图片bark.jpg 16 var bark = new Image(); 17 bark.src = "/templets/default/images/logo.jpg"; 18 // 图片加载完成后,将其显示在canvas上 19 bark.onload=function(){ 20 context.fillStyle = context.createPattern(bark, 'repeat'); 21 context.fillRect(5, 50, 100, 200); 22 } 23 } 24 &/script& 25 &/head& 26 27 &body& 28 &canvas id="diagonal" width="200" height="200"& &/canvas& 29 &/body& 30 &/html&复制代码17.缩放canvas对象。为了在新的位置画出大一点的树,我们将使用另一种变换方式&&缩放函数context.scale复制代码1 &!DOCTYPE HTML& 2 &html lang="en"& 3 &head& 4 &meta charset="utf-8"& 5 &title&未命名文件&/title& 6 &style& 7 #diagonal { 8 /style& 11 &script& 12 window.onload=function(){ 13 function drawTree(context) { 14 // 创建用作树干纹理的三阶水平渐变 15 var trunkGradient = context.createLinearGradient(-5, -50, 50, -50); 16 // 树干的左侧边缘是一般程度的棕色 17 trunkGradient.addColorStop(0, '#663300'); 18 // 树干中间偏左的位置颜色要淡一些 19 trunkGradient.addColorStop(0.4, '#996600'); 20 // 树干右侧边缘的颜色要深一些 21 trunkGradient.addColorStop(1, '#552200'); 22 // 使用渐变色填充树干 23 context.fillStyle = trunkG 24 context.fillRect(-5, -50, 50, 100); 25 // 接下来,创建垂直渐变,以用作树冠在树干上投影 26 var canopyShadow = context.createLinearGradient(0, -50, 50, 100); 27 // 投影渐变的起点是透明度设为50%的黑色 28 canopyShadow.addColorStop(0, 'rgba(0, 0, 0, 0.5)'); 29 // 方向垂直向下,渐变色在很短的距离内迅速渐变至完全透明,这段长度之外的树干上没有投影 30 canopyShadow.addColorStop(0.2, 'rgba(0, 0, 0, 0.0)'); 31 // 在树干上填充投影渐变 32 context.fillStyle = canopyS 33 context.fillRect(-5, -50, 50, 100); 34 /*createCanopyPath(context); 35 context.lineWidth = 4; 36 context.lineJoin = 'round'; 37 context.strokeStyle = '#663300'; 38 context.stroke(); 39 context.fillStyle = '#339900'; 40 context.fill(); */ 41 } 42 var canvas = document.getElementById('diagonal'); 43 var context = canvas.getContext('2d'); 44 // 在(50,50)的位置绘制第一棵树 45 context.save(); 46 context.translate(30, 30); 47 drawTree(context); 48 context.restore(); 49 // 在(100,100)的位置绘制第二棵树 50 context.save(); 51 context.translate(100, 100); 52 // 将第二棵树的宽高分别放大至原来的2倍 53 context.scale(2, 2); 54 drawTree(context); 55 context.restore(); 56 } 57 &/script& 58 &/head& 59 60 &body& 61 &canvas id="diagonal" width="200" height="200"& &/canvas& 62 &/body& 63 &/html&复制代码scale函数带有两个参数来分别代表在x、y两个维度的值。每个参数在canvas显示图像的时候,向其传递在本方向轴上图像要放大(或者缩小)的量。如果x值为2,就代表所绘制图像中全部元素都会变成两倍宽,如果y值为0.5,绘制出来的图像全部元素都会变成之前的一半高。如果对一个不在原点的图形进行旋转变换,那么rotate变换函数会将图形绕着原点旋转而不是在原地旋转。与之类似,如果进行缩放操作时没有将图形放置到合适的坐标上,那么所有路径坐标都会被同时缩放。取决于缩放比例的大小,新的坐标可能会全部超出canvas范围,进而给开发人员带来困惑,为什么我的缩放操作会把图像删了?&18.Canvas变换。复制代码1 &!DOCTYPE HTML& 2 &html lang="en"& 3 &head& 4 &meta charset="utf-8"& 5 &title&未命名文件&/title& 6 &style& 7 #diagonal { 8 /style& 11 &script& 12 window.onload=function(){ 13 function drawTree(context) { 14 // 创建用作树干纹理的三阶水平渐变 15 var trunkGradient = context.createLinearGradient(-5, -50, 50, -50); 16 // 树干的左侧边缘是一般程度的棕色 17 trunkGradient.addColorStop(0, '#663300'); 18 // 树干中间偏左的位置颜色要淡一些 19 trunkGradient.addColorStop(0.4, '#996600'); 20 // 树干右侧边缘的颜色要深一些 21 trunkGradient.addColorStop(1, '#552200'); 22 // 使用渐变色填充树干 23 context.fillStyle = trunkG 24 context.fillRect(-5, -50, 50, 100); 25 // 接下来,创建垂直渐变,以用作树冠在树干上投影 26 var canopyShadow = context.createLinearGradient(0, -50, 50, 100); 27 // 投影渐变的起点是透明度设为50%的黑色 28 canopyShadow.addColorStop(0, 'rgba(0, 0, 0, 0.5)'); 29 // 方向垂直向下,渐变色在很短的距离内迅速渐变至完全透明,这段长度之外的树干上没有投影 30 canopyShadow.addColorStop(0.2, 'rgba(0, 0, 0, 0.0)'); 31 // 在树干上填充投影渐变 32 context.fillStyle = canopyS 33 context.fillRect(-5, -50, 50, 100); 34 } 35 var canvas = document.getElementById('diagonal'); 36 var context = canvas.getContext('2d'); 37 // 在(50,50)的位置绘制第一棵树 38 context.save(); 39 context.translate(100,100); 40 drawTree(context); 41 // 从整体上前四个参数负责缩放和旋转,后两个参数是平移,前四个参数1,4为一组控制缩放,2,3为一组控制旋转,1和2是x值,3和4是y值,5和6分别为x,y的平移 42 context.transform(1, 0, -1, 1, 55, 0); 43 // 使用透明度为20%的黑色填充树干 44 context.fillStyle = 'rgba(0, 0, 0, 0.2)'; 45 context.fillRect(-5, -50, 50, 100); 46 // 使用已有的阴影效果重新绘制树 47 context.fill(); 48 // 恢复之前的canvas状态 49 context.restore(); 50 } 51 &/script& 52 &/head& 53 54 &body& 55 &canvas id="diagonal" width="500" height="500"& &/canvas& 56 &/body& 57 &/html&复制代码19.Canvas文本。操作canvas文本的方式与操作其他路径对象的方式相同:可以描绘文本轮廓和填充文本内部;同时,所有能够应用于其他图形的变换和样式都能用于文本。context对象的文本绘制功能由两个函数组成:(1)fillText(text,x, y,maxwidth)(2)strokeText(text,x,y,maxwidth)两个函数的参数完全相同,必选参数包括文本参数以及用于指定文本位置的坐标参数。maxwidth是可选参数,用于限制字体大小,它会将文本字体强制收缩到指定尺寸。此外,还有一个measureText函数可供使用,该函数会返回一个度量对象,其中包含了在当前context环境下指定文本的实际显示宽度。为了保证文本在各浏览器下都能正常显示,Canvas API为context提供了类似于CSS的属性,以此来保证实际显示效果的高度可配置。font(CSS字体字符串,例如:italic Arial,scan-serif)、textAlign(start、end、left、right、center,默认是start)、textBaseline(top、hanging、middle、alphabetic、ideographic、bottom,默认是alphabetic)。复制代码1 &!DOCTYPE HTML& 2 &html lang="en"& 3 &head& 4 &meta charset="utf-8"& 5 &title&未命名文件&/title& 6 &style& 7 #diagonal { 8 /style& 11 &script& 12 window.onload=function(){ 13 var canvas = document.getElementById('diagonal'); 14 var context = canvas.getContext('2d'); 15 // 字号为60px,字体为impact 16 context.font = "60px impact"; 17 // 将文本填充为棕色 18 context.fillStyle = '#996600'; 19 // 将文本设为居中对齐 20 context.textAlign = 'center'; 21 context.textBaseline='middle'; 22 // 在canvas顶部中央的位置,以大字体的形式显示文本 23 context.fillText('Hello Jsdarkhorse!', 250, 250, 400); 24 context.restore(); 25 } 26 &/script& 27 &/head& 28 29 &body& 30 &canvas id="diagonal" width="500" height="500"& &/canvas& 31 &/body& 32 &/html&复制代码20.应用阴影。可以通过几种全局context属性来控制阴影。shadowColor任何CSS中的颜色值。可以使用透明度(alpha)ShadowOffsetX像素值。值为正数,向右移动阴影;值为负数,向左移动阴影shadowOffsetY像素值。值为正数,向下移动阴影;值为负数,向上移动阴影shadowBlur高斯模糊值。值越大,阴影边缘越模糊复制代码1 &!DOCTYPE HTML& 2 &html lang="en"& 3 &head& 4 &meta charset="utf-8"& 5 &title&未命名文件&/title& 6 &style& 7 #diagonal { 8 /style& 11 &script& 12 window.onload=function(){ 13 var canvas = document.getElementById('diagonal'); 14 var context = canvas.getContext('2d'); 15 // 设置文字阴影的颜色为黑色,透明度为20% 16 context.shadowColor = 'rgba(0, 0, 0, 0.2)'; 17 // 将阴影向右移动15px,向上移动10px 18 context.shadowOffsetX = 15; 19 context.shadowOffsetY = -10; 20 // 轻微模糊阴影 21 context.shadowBlur = 2; 22 // 字号为60px,字体为impact 23 context.font = "60px impact"; 24 // 将文本填充为棕色 25 context.fillStyle = '#996600'; 26 // 将文本设为居中对齐 27 context.textAlign = 'center'; 28 context.textBaseline='middle'; 29 // 在canvas顶部中央的位置,以大字体的形式显示文本 30 context.fillText('Hello Jsdarkhorse!', 250, 250, 400); 31 context.restore(); 32 } 33 &/script& 34 &/head& 35 36 &body& 37 &canvas id="diagonal" width="500" height="500"& &/canvas& 38 &/body& 39 &/html&复制代码21.像素数据。Canvas API最有用的特性之一是允许开发人员直接访问canvas底层像素数据。这种数据访问是双向的:一方面,可以以数值数组形式获取像素数据;另一方面,可以修改数组的值以将其应用于canvas。context.getImageData(sx, sy, sw, sh)。这个函数返回当前canvas状态并以数值数组的方式显示。具体来说,返回的对象包括三个属性。width:每行有多少个像素。height:每列有多少个像素。data:一维数组,存有从canvas获取的每个像素的RGBA值。该数组为每个像素保存了四个值&&红、绿、蓝和alpha透明度。每个值都在0到255之间。因此,canvas上的每个像素在这个数组中就变成了四个整数值。getImageData函数有四个参数,该函数只返回这四个参数所限定的区域内的数据。只有被x、y、width和height四个参数框定的矩形区域内的canvas上的像素才会被取到,因此要想获取所有像素数据,就需要这样传入参数:getImageData(0, 0, canvas.width, canvas.height)。因为每个像素由四个图像数据表示,所以要计算指定的像素点对应的值是什么就有点头疼。不要紧,下面有公式。在给定了width和height的canvas上,在坐标(x ,y)上的像素的构成如下。红色部分:((width * y) + x) * 4绿色部分:((width * y) + x) * 4 + 1蓝色部分:((width * y) + x) * 4 + 2透明度部分:((width * y) + x) * 4 + 3修改了任何像素的红、绿、蓝和alpha值之后,可以通过第二个函数来更新canvas上的显示,那就是context.putImageData(imagedata, dx, dy)。putImageData允许开发人员传入一组图像数据,其格式与最初从canvas上获取来的是一样的。这个函数使用起来非常方便,因为可以直接用从canvas上获取数据加以修改然后返回。一旦这个函数被调用,所有新传入的图像数据值就会立即在canvas上更新显示出来。dx和dy参数可以用来指定偏移量,如果使用,则该函数就会跳到指定的canvas位置去更新显示传进来的像素数据。最后,如果想预先生成一组空的canvas数据,则可调用context.createImageData(sw, sh),这个函数可以创建一组图像数据并绑定在canvas对象上。这组数据可以像先前那样处理,只是在获取canves数据时,这组图像数据不一定会反映canvas的当前状态。22.Canvas的安全机制。上面讨论了直接操纵像素数据的方法,在这里有必要重点提醒一下,大多数开发者都会合法使用像素数据操作。尽管如此,还是会有人出于某些邪恶的目的利用这种从canvas直接获取并且修改数据的能力。出于这个原因,origin-clean canvas的概念应运而生,换句话说,如果canvas中的图片并非来自包含它的页面所在的域,页面中的脚本将不能取得其中的数据。然而,在没有Canvas API以前,无法使用编程的方式获取下载图片的像素信息。来自其他网站的私有图片可以显示在本地,但无法被读取或者复制。如果允许脚本读取本地之外的图像数据,那么整个网络中的用户照片以及其他敏感的在线图片文档将被&无限制地共享&。为了避免如此,在getImageData函数被调用的时候,如果canvas中的图像来自其他域,就会抛出安全异常。这样的话,只要不获取显示着其他域中图片的canvas的数据,那么就可以随意呈现这些远程图片。在开发的过程中要注意这个限制条件,使用安全的渲染方式。&更多html5内容请点击&
、 、 、 、 、13291人阅读
android(18)
转载http://m.oschina.net/blog/321024
Android ImageView圆形头像 图片完全解析
&我们在做项目的时候会用到圆形的图片,比如用户头像,类似QQ。用户在用QQ更换头像的时候,上传的图片都是矩形的,但显示的时候确是圆形的。
& & &&原理:先在canvas上面画一个圆形,参照圆形的起点坐标、半径,再画一个边长为圆的直径的bitmap(这个bitmap就是你想画的圆形头像),此时圆和bitmap重叠在一起,圆在下面,bitmap在上面,bitmap覆盖着圆(如下图,其实圆是在bitmap后面的,看不到的。为了形象,我用ps搞了一个半透明圆效果)。
& &&& 关键点来了:这时,圆形和bitmap相交的部分正是圆大小的面积,如果能将bitmap与圆相交之外的部分去掉,那么我们看到的是不是bitmap的圆形部分?(如下图蓝色部分)
&&&&&&&&搞清楚原理后,下面我门来看代码是怎么实现的。
&&&&public&Bitmap&toRoundBitmap(Bitmap&bitmap)&{
&&&& //圆形图片宽高
&&&& int&width&=&bitmap.getWidth();
&&&& int&height&=&bitmap.getHeight();
&&&& //正方形的边长
&&&& int&r&=&0;
&&&& //取最短边做边长
&&&& if(width&&&height)&{
&&&& }&else&{
&&&& //构建一个bitmap
&&&& Bitmap&backgroundBmp&=&Bitmap.createBitmap(width,
&&&&&&&&&&&&&&&&&height,&Config.ARGB_8888);
&&&& //new一个Canvas,在backgroundBmp上画图
&&&& Canvas&canvas&=&new&Canvas(backgroundBmp);
Paint&paint&=&new&Paint();
//设置边缘光滑,去掉锯齿
paint.setAntiAlias(true);
//宽高相等,即正方形
RectF&rect&=&new&RectF(0,&0,&r,&r);
//通过制定的rect画一个圆角矩形,当圆角X轴方向的半径等于Y轴方向的半径时,
//且都等于r/2时,画出来的圆角矩形就是圆形
canvas.drawRoundRect(rect,&r/2,&r/2,&paint);
//设置当两个图形相交时的模式,SRC_IN为取SRC图形相交的部分,多余的将被去掉
paint.setXfermode(new&PorterDuffXfermode(Mode.SRC_IN));
//canvas将bitmap画在backgroundBmp上
canvas.drawBitmap(bitmap,&null,&rect,&paint);
//返回已经绘画好的backgroundBmp
&&&&&&&&return&backgroundB
& & & 下面解释一下关键的几行代码:
canvas.drawRoundRect(rect,&r/2,&r/2,&paint);
& & & 这行代码是画一个圆角矩形,X、Y方向的圆角半径相等时,且长度为正方形边长的一半时,则画出来的圆角矩形就是圆,如下图:
对于这行代码,大家可以看看这篇文章
paint.setXfermode(new&PorterDuffXfermode(Mode.SRC_IN));
这行代码是设置图片相交时的模式,这篇文章有一张很好的图说明,
canvas.drawBitmap(bitmap,&null,&rect,&paint);
而这行代码则是画一个bitmap到canvas上面去,官方API
参数:src 可以为空,不为空时,canvas将bitmap画到该区域;
参数:dst 不为空,显示bitmap的显示区域。
如果src和dst的区域不一样,那么bitmap画的地方和显示的地方将不一样,即只能看到一部分bitmap。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:164678次
积分:2030
积分:2030
排名:第13114名
原创:38篇
转载:71篇
评论:17条
(5)(5)(8)(3)(3)(5)(2)(2)(1)(1)(1)(1)(1)(1)(7)(3)(5)(1)(3)(2)(2)(6)(3)(1)(4)(5)(1)(3)(14)(5)(4)(1)}

我要回帖

更多关于 canvas 设置画布大小 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信