资源:http://www.ido321.com/997.html

一、图像处理(非特别说明,全部结果均来自最新版Google)

在HTML 5中,不仅能够使用Canvas API绘制图形,也能够用于处理网络或磁盘中的图像文件。然后绘制在画布中。

绘制图像时,须要使用drawImage()方法:

drawImage(image,x,y):image是图像引用。x,y是绘制图像时在画布中的起始位置

drawImage(image,x,y,w,h):前三个同上,w,h是绘制时图像的宽度和高度,能够用于缩放图像

drawImage(image,sx,sy,sw,sh,dx,dy,dw.dh):将画布中已经绘制好的图像的所有或者局部拷贝到画布的还有一个位置。

sx,sy,sw,sh各自是原图中被复制区域的起始位置宽高,dx,dy,dw,dh表示复制后图像在画布中的起始位置和高宽。

   1: // 获取canvas 的ID
   2:     var canvas = document.getElementById('canvas');
   3:     if (canvas == null)
   4:     {
   5:         return false;
   6:     }
   7:     // 获取上下文
   8:     var context = canvas.getContext('2d');
   9:     context.fillStyle = '#eeeeff';
  10:     context.fillRect(0,0,400,300);
  11:     var image = new Image();

12: image.src =
‘my.jpg’;

// onload事件实现边绘制边载入

  13:     image.onload = function()
  14:     {
  15:         drawImage(context,image);
  16:     };
  17:     function drawImage(context,image)
  18:     {
  19:         for (var i = 0; i < 7; i++) {
  20:             context.drawImage(image,0+i*50,0+i*25,100,100);
  21:         };
  22:     }

效果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTA0Mzg0Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

1、图像平铺

   1: // 获取canvas 的ID
   2:     var canvas = document.getElementById('canvas');
   3:     if (canvas == null)
   4:     {
   5:         return false;
   6:     }
   7:     // 获取上下文
   8:     var context = canvas.getContext('2d');
   9:     context.fillStyle = '#eeeeff';
  10:     context.fillRect(0,0,400,300);
  11:     var image = new Image();
  12:     image.src = 'my.jpg';
  13:     // onload事件实现边绘制边载入
  14:     image.onload = function()
  15:     {
  16:         drawImage(canvas,context,image);
  17:     };
  18:     function drawImage(canvas,context,image)
  19:     {
  20:         // 平铺比例
  21:         var scale = 5;
  22:         // 缩小图像后宽度
  23:         var n1 = image.width / scale;
  24:         // 缩小图像后高度
  25:         var n2 = image.height / scale;
  26:         // 横向平铺个数
  27:         var n3 = canvas.width / n1;
  28:         // 纵向平铺个数
  29:         var n4 = canvas.height / n2;
  30:         for(var i = 0; i < n3; i++)
  31:         {
  32:             for(var j=0; j < n4; j++)
  33:             {
  34:                 context.drawImage(image,i*n1,j*n2,n1,n2);
  35:             }
  36:         }
  37:     }

效果:

在HTML 5中,利用context.createPattern(image,type)也能够实现平铺,type取值同background-image的平铺值一样。

   1: image.onload = function()
   2:     {
   3:         // drawImage(canvas,context,image);
   4:         var ptrn = context.createPattern(image,'repeat');
   5:         context.fillStyle = ptrn;
   6:         context.fillRect(0,0,400,300);
   7:     };

能相同实现平铺(图片没有缩放,所以是原图大小平铺)

2、图像裁剪

   1: // 获取canvas 的ID
   2:     var canvas = document.getElementById('canvas');
   3:     if (canvas == null)
   4:     {
   5:         return false;
   6:     }
   7:     // 获取上下文
   8:     var context = canvas.getContext('2d');
   9:     // 获取渐变对象
  10:     var g1 = context.createLinearGradient(0,400,300,0);
  11:     // 加入渐变颜色
  12:     g1.addColorStop(0,'rgb(255,255,0)');
  13:     g1.addColorStop(1,'rgb(0,255,255)');
  14:     context.fillStyle = g1;
  15:     context.fillRect(0,0,400,300);
  16:     var image = new Image();
  17:     // onload事件实现边绘制边载入
  18:     image.onload = function()
  19:     {
  20:         drawImage(context,image);
  21:     };
  22:     image.src = 'my.jpg';
  23:     function drawImage(context,image)
  24:     {
  25:         create5StarClip(context);
  26:         context.drawImage(image,-50,-150,300,300);
  27:     }
  28:     function create5StarClip(context)
  29:     {
  30:         var dx = 100;
  31:         var dy = 0;
  32:         var s  = 150;
  33:          // 创建路径
  34:          context.beginPath();
  35:          context.translate(100,150);
  36:          var x = Math.sin(0);
  37:          var y = Math.cos(0);
  38:          var dig = Math.PI/5 *4;
  39:          // context.moveTo(dx,dy);
  40:          for (var i = 0; i < 5; i++) {
  41:              var x = Math.sin(i * dig);
  42:              var y = Math.cos(i * dig);
  43:              context.lineTo(dx+x*s,dy+y*s);
  44:          }
  45:          context.clip();
  46:     }

效果:

3、像素处理

   1: // 获取canvas 的ID
   2:     var canvas = document.getElementById('canvas');
   3:     if (canvas == null)
   4:     {
   5:         return false;
   6:     }
   7:     // 获取上下文
   8:     var context = canvas.getContext('2d');
   9:     var image = new Image();
  10:     image.src = 'my.jpg';
  11:     // onload事件实现边绘制边载入
  12:     image.onload = function()
  13:     {
  14:         context.drawImage(image,0,0);
  15:         // 获取原图像素
  16:         var imageData = context.getImageData(0,0,image.width,image.height);
  17:         for (var i = 0,n= imageData.data.length; i <n; i += 4) {
  18:             // red
  19:             imageData.data[i+0] = 255-imageData.data[i+0];
  20:             // green
  21:             imageData.data[i+1] = 255-imageData.data[i+2];
  22:             // blue
  23:             imageData.data[i+2] = 255-imageData.data[i+1];
  24:         };
  25:         // 将调整后的像素应用到图像
  26:         context.putImageData(imageData,0,0);
  27:     };

getImageData(sx,sy,sw,sh):表示获取像素区域的起始坐标和高宽。返回一个具有width,height,data等属性CanvasPixelArray对象。当中data属性存放像素数据的数组,形如[r1,g1,b1,a1,r2,g2,b2,a2……],r1,g1,b1,a1各自是第一个像素的红绿蓝值及透明度,以此类推。

putImageData(imagedata,dx,dy[,dirtyx,dirtyy,dirtyWidth,dirtyHeight]):将像素数据又一次绘制到图像上。imagedata是像素数组。dx,dy表示重绘的起始位置。后面四个參数是给出一个矩形的左上角坐标和高宽。

Canvas API的像素操作仅仅有部分浏览器支持。截图效果来自新版的火狐浏览器

二、绘制文字

   1: // 获取canvas 的ID
   2:     var canvas = document.getElementById('canvas');
   3:     if (canvas == null)
   4:     {
   5:         return false;
   6:     }
   7:     // 获取上下文
   8:     var context = canvas.getContext('2d');
   9:     context.fillStyle = '#00f';
  10:     // 设置文字属性
  11:     context.font = 'italic 30px sans-serif';
  12:     context.textBaseline = 'top';
  13:     // 填充字符串
  14:     context.fillText('Canvas绘制文字',0,0);
  15:     context.font = 'bold 30px sans-serif';
  16:     // 轮廓字符串
  17:     context.strokeText('改变位置了',50,50);

fillText(string,x,y[,maxwidth]):前三个不解释。maxwidth表示显示文字的最大宽度。可防止文字溢出

strokeText(string,x,y[,maxwidth]:同上。

文字属性设置

font:设置字体

textAlign:水平对齐方式。取值但是start/end/left/right/center.默认是start

textBaseline:垂直对齐方式。取值但是top/hanging/middle/alphabetic/ideographic/bottom.默认是alphabetic

终于效果

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTA0Mzg0Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

下一篇:9个JQuery和5个JavaScript经典面试题

版权声明:本文博客原创文章。博客,未经同意,不得转载。

Canvas入门(3):图像处理和渲染文本的更多相关文章

  1. canvas学习笔记(中篇) -- canvas入门教程-- 颜色/透明度/渐变色/线宽/线条样式/虚线/文本/阴影/图片/像素处理

    [中篇] -- 建议学习时间4小时  课程共(上中下)三篇 此笔记是我初次接触canvas的时候的学习笔记,这次特意整理为博客供大家入门学习,几乎涵盖了canvas所有的基础知识,并且有众多练习案例, ...

  2. Canvas入门(2):图形渐变和图像形变换

    来源:http://www.ido321.com/986.html 一.图形渐变(均在最新版Google中测试) 1.绘制线性渐变 1: // 获取canvas 的ID 2: var canvas = ...

  3. HTML5 canvas入门

    HTML5 Canvas入门 <canvas> 标签定义图形,比如图表和其他图像,您必须使用脚本来绘制图形.在画布上(Canvas)画一个红色矩形,渐变矩形,彩色矩形,和一些彩色的文字. ...

  4. Canvas入门(1):绘制矩形、圆、直线、曲线等基本图形

    来源:http://www.ido321.com/968.html 一.Canvas的基础知识 Canvas是HTML 5中新增的元素,专门用于绘制图形.canvas元素就相当于一块“画布”,一块无色 ...

  5. canvas入门之时钟的实现

    canvas 入门之作: 三步实现一个时钟: 直接上效果:   step 1  : 背景制作首先制作从1-12的数字: var canvas = document.getElementById('ca ...

  6. 基于OpenGL编写一个简易的2D渲染框架-05 渲染文本

    阅读文章前需要了解的知识:文本渲染 https://learnopengl-cn.github.io/06%20In%20Practice/02%20Text%20Rendering/ 简要步骤: 获 ...

  7. Canvas 入门案例

    五.  Canvas 入门案例 1.  canvas 圆形绘制 <!DOCTYPE html> <html lang="en"> <head> ...

  8. Canvas入门笔记-实现极简画笔

    今天学习了Html5 Canvas入门,已经有大神写得很详细了http://www.cnblogs.com/tim-li/archive/2012/08/06/2580252.html#8 在学习过后 ...

  9. 前端学习 node 快速入门 系列 —— 服务端渲染

    其他章节请看: 前端学习 node 快速入门 系列 服务端渲染 在简易版 Apache一文中,我们用 node 做了一个简单的服务器,能提供静态资源访问的能力. 对于真正的网站,页面中的数据应该来自服 ...

随机推荐

  1. 解决一bug的流程复盘

    听同事说有一个功能不好使了,当时有事,过了一段时间来看看这个bug 解决问题时,看的是老的日志,根据老日志看来看去没有发现问题,觉得很困惑 然后手动执行了一下,发现问题没有重现.与另一个团队的同事沟通 ...

  2. 辛星整理3linux笔记,免费下载点,我希望对你有所帮助

    忙乱,这是我第一次看李指出老师的视频时,,这本书是关于116页面,在csdn下载对:点我下载 ,假设左边的地址崩溃了,也能够在浏览器中输入例如以下地址然后下载:http://download.csdn ...

  3. 使用python+flask让你自己api(教程源代码)

    1.背景 ok,这可能是很多朋友和我一样经常使用的各种api,例facebook的.github的.甚至微信api.因此,很多人都想使自己的api.在线教程在这方面它是非常小的,今天,我做了一个平稳, ...

  4. Unity3d 镜面反射 vertex and frag Shader源代码

    Unity3d 镜面反射 网上能找到的基本上是固定管道或表面渲染的shader. 特此翻译为顶点.片段渲染的Shader, 本源代码仅仅涉及shader与cs部分. Editor部分使用NGUI绘制的 ...

  5. 一个sql的优化

    原文:一个sql的优化 目的:为了查询某天某个服务器上的登录id的个数   刚开始编写的sql: select count(a.mac) logusers from Log_MacLogin_All ...

  6. JAVA学习第六十二课 — TCP协议练习

    通过练习掌握TCP在进行传输过程中的问题 练习1:创建一个英文大写转换server client输入字母数据,发送给服务端,服务端收到后显示到控制台,并将该数据转成大写返回client,知道clien ...

  7. 纯CSS3实现的图片滑块程序 效果非常酷

    原文:纯CSS3实现的图片滑块程序 效果非常酷 之前我们经常会看到很多利用jQuery实现的焦点图插件,种类太多了,今天我想给大家分享一款利用纯CSS3实现的图片滑块应用,完全是利用CSS3的相关特性 ...

  8. zzu--2014年11月16日月潭赛 C称号

    1230: Magnets Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 24  Solved: 13 [id=1230" style=&q ...

  9. android之Fragment(官网资料翻译)

    Fragment要点 Fragment作为Activity界面的一部分组成出现 能够在一个Activity中同一时候出现多个Fragment,而且,一个Fragment亦可在多个Activity中使用 ...

  10. 教你Ant安装和配置

    Ant它是基于Java施工工具,它的主要作用是产生能够运行Java计划,把握Ant一些功能可以使项目更专业. 忙乱,可以在这里下载2014年8最近一个月Ant http://download.csdn ...