首頁 web前端 html教學 Canvas入门(3):图像处理和绘制文字_html/css_WEB-ITnose

Canvas入门(3):图像处理和绘制文字_html/css_WEB-ITnose

Jun 24, 2016 am 11:56 AM

来源: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: }
登入後複製

效果:

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

最终效果


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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

HTML容易為初學者學習嗎? HTML容易為初學者學習嗎? Apr 07, 2025 am 12:11 AM

HTML適合初學者學習,因為它簡單易學且能快速看到成果。 1)HTML的學習曲線平緩,易於上手。 2)只需掌握基本標籤即可開始創建網頁。 3)靈活性高,可與CSS和JavaScript結合使用。 4)豐富的學習資源和現代工具支持學習過程。

HTML,CSS和JavaScript的角色:核心職責 HTML,CSS和JavaScript的角色:核心職責 Apr 08, 2025 pm 07:05 PM

HTML定義網頁結構,CSS負責樣式和佈局,JavaScript賦予動態交互。三者在網頁開發中各司其職,共同構建豐富多彩的網站。

了解HTML,CSS和JavaScript:初學者指南 了解HTML,CSS和JavaScript:初學者指南 Apr 12, 2025 am 12:02 AM

WebDevelovermentReliesonHtml,CSS和JavaScript:1)HTMLStructuresContent,2)CSSStyleSIT和3)JavaScriptAddSstractivity,形成thebasisofmodernWebemodernWebExexperiences。

Gitee Pages靜態網站部署失敗:單個文件404錯誤如何排查和解決? Gitee Pages靜態網站部署失敗:單個文件404錯誤如何排查和解決? Apr 04, 2025 pm 11:54 PM

GiteePages靜態網站部署失敗:404錯誤排查與解決在使用Gitee...

HTML中起始標籤的示例是什麼? HTML中起始標籤的示例是什麼? Apr 06, 2025 am 12:04 AM

AnexampleOfAstartingTaginHtmlis,beginSaparagraph.startingTagSareEssentialInhtmlastheyInitiateEllements,defiteTheeTheErtypes,andarecrucialforsstructuringwebpages wepages webpages andConstructingthedom。

如何用CSS3和JavaScript實現圖片點擊後周圍圖片散開並放大效果? 如何用CSS3和JavaScript實現圖片點擊後周圍圖片散開並放大效果? Apr 05, 2025 am 06:15 AM

實現圖片點擊後周圍圖片散開並放大效果許多網頁設計中,需要實現一種交互效果:點擊某張圖片,使其周圍的...

HTML,CSS和JavaScript:Web開發人員的基本工具 HTML,CSS和JavaScript:Web開發人員的基本工具 Apr 09, 2025 am 12:12 AM

HTML、CSS和JavaScript是Web開發的三大支柱。 1.HTML定義網頁結構,使用標籤如、等。 2.CSS控製網頁樣式,使用選擇器和屬性如color、font-size等。 3.JavaScript實現動態效果和交互,通過事件監聽和DOM操作。

網頁批註如何實現Y軸位置的自適應佈局? 網頁批註如何實現Y軸位置的自適應佈局? Apr 04, 2025 pm 11:30 PM

網頁批註功能的Y軸位置自適應算法本文將探討如何實現類似Word文檔的批註功能,特別是如何處理批註之間的間�...

See all articles