第15章 使用 Canvas 繪圖

<canvas>元素是HTML5添加的特性,這個(gè)元素負(fù)責(zé)在頁面中設(shè)定一個(gè)區(qū)域,然后就可以通過 JS 動(dòng)態(tài)地在這個(gè)區(qū)域中繪制圖形森渐。

15.1 基本用法
要使用<canvas>元素趾娃,必須先設(shè)置其width和height屬性,指定可以繪圖的區(qū)域大小喂很。

<canvas id="drawing" width="200" height="200" >
A drawing of something
</canvas>

使用 toDataURL() 方法惜颇,可以導(dǎo)出在<canvas>元素上繪制的圖像。這個(gè)方法接收一個(gè)參數(shù)少辣,即圖像的MIME類型格式凌摄,而且適合用于創(chuàng)建圖像的任何上下文。

15.2 2D上下文

2D上下文的坐標(biāo)開始于 <canvas> 元素的左上角漓帅,原點(diǎn)坐標(biāo)是(0,0)锨亏。所有坐標(biāo)值都基于這個(gè)原點(diǎn)計(jì)算,x值越大表示越靠右忙干,y值越大表示越靠下器予。

15.2.1 填充和描邊
2D 上下文的兩種基本繪圖操作是填充和描邊。

var drawing = document.getElementById('drawing');

//確定瀏覽器支持<canvas>元素
if( drawing.getContext ){
var context = drawing.getContext('2d');
context.strokeStyle = 'red'; //描邊
context.fillStyle = "#0000ff"; //填充
}

15.2.2 繪制矩形

矩形是唯一一種可以直接在 2D 上下文中繪制的形狀捐迫。與矩形有關(guān)的方法包括 fillRect()乾翔、strokeRect()和clearRect()。這三個(gè)方法都能接收4個(gè)參數(shù):矩形的x坐標(biāo)施戴,矩形的y坐標(biāo)反浓,
矩形寬度和矩形高度。單位都是像素赞哗。

(1) fillRect() 方法在畫布上繪制的矩形會(huì)填充指定的顏色勾习。填充顏色通過 fillStyle 屬性指定

var drawing = document.getElementById('drawing');

//確定瀏覽器支持<canvas>元素
if( drawing.getContext ){

var context = drawing.getContext('2d');

//繪制紅色矩形
context.fillStyle = "#ff0000";
context.fillRect(10, 10, 50, 50);

}

(2) strokeRect() 方法在畫布上繪制的矩形會(huì)使用指定的顏色描邊。描邊顏色通過 strokeStyle 屬性指定

var drawing = document.getElementById('drawing');

//確定瀏覽器支持<canvas>元素
if( drawing.getContext ){

var context = drawing.getContext('2d');

context.lineWidth = 10; //控制線條寬度
context.lineCap = 'square';//控制線條末端形狀:butt:平頭 round: 圓頭 square: 方頭

context.lineJoin = "miter" //控制線條相交方式圓交懈玻、斜交巧婶、斜接(round,bevel,miter)

//繪制紅色描邊矩形
context.strokeStyle = "#ff0000";
context.strokeRect(10,10,50,50);

//繪制半透明的藍(lán)色描邊矩形
context.strokeStyle = "rgba(0,0,255,0.5)";
context.strokeRect(30,30,50,50);    

}

(3) clearRect() 方法用于清除畫布上的矩形區(qū)域乾颁,這個(gè)方法可以把繪制上下文中的某一矩形區(qū)域變透明。

var drawing = document.getElementById('drawing');

//確定瀏覽器支持<canvas>元素
if( drawing.getContext ){

var context = drawing.getContext('2d');

//繪制紅色矩形
context.fillStyle = "#ff0000";
context.fillRect(10,10,50,50);

//繪制半透明的藍(lán)色矩形
context.fillStyle = "rgba(0,0,255,0.5)";
context.fillRect(30,30,50,50);

//在兩個(gè)矩形重疊的地方清除一個(gè)小矩形
context.clearRect(35,35,20,20);

}

15.2.3 繪制路徑

//繪制一個(gè)不帶數(shù)字的時(shí)鐘表盤

var drawing = document.getElementById('drawing');

//確定瀏覽器支持<canvas>元素
if( drawing.getContext ){

var context = drawing.getContext('2d');

 //開始路徑
context.beginPath();

//繪制外圓
context.arc(100, 100, 100, 0, 2 * Math.PI, false);

//繪制內(nèi)圓
context.moveTo(194, 100);
context.arc(100, 100, 90, 0, 2 * Math.PI, false);

//繪制分針
context.moveTo(100, 100);
context.lineTo(100, 15);

//繪制時(shí)針
context.moveTo(100, 100);
context.lineTo(35, 100);

//描邊路徑
context.stroke();

}

//繪制一條彎曲的線

var drawing = document.getElementById('drawing');

//確定瀏覽器支持<canvas>元素
if( drawing.getContext ){

var context = drawing.getContext('2d');

//指定繪制路徑的起始點(diǎn)
context.moveTo(50, 50);
//繪制一條到坐標(biāo)(150,50)的水平直線
context.lineTo(150, 50);

//端點(diǎn)1
var p1 = {
    x: 200,
    y: 50
};

var p2 = {
    x: 200,
    y: 100
};

context.arcTo(p1.x, p1.y, p2.x, p2.y, 50);

//設(shè)置線條顏色為藍(lán)色
context.strokeStyle = "blue";

//按照上述繪制路徑繪制弧線
context.stroke();

}

15.2.4 繪制文本

var drawing = document.getElementById('drawing');

//確定瀏覽器支持<canvas>元素
if( drawing.getContext ){

var context = drawing.getContext('2d');

//開始路徑
context.beginPath();

context.font = "bold 14px Arial";
context.textAlign = 'center';
context.textBaseline = 'middle';
context.fillText('12', 100, 20);
context.fillText('9', 20, 100);
context.fillText('6', 100, 140);
context.fillText('3', 180, 100);

//起點(diǎn)對齊
context.textAlign = "start";
context.fillText("12", 100, 40);

//終點(diǎn)對齊
context.textAlign = "end";
context.fillText('12',100,60);

//繪制外圓
context.arc(100, 100, 100, 0, 2 * Math.PI, false);

//繪制內(nèi)圓
context.moveTo(194, 100);
context.arc(100, 100, 90, 0, 2 * Math.PI, false);

//繪制分針
context.moveTo(100, 100);
context.lineTo(100, 15);

//繪制時(shí)針
context.moveTo(100, 100);
context.lineTo(35, 90);

//描邊路徑
context.stroke();

}

15.2.5 變換

var drawing = document.getElementById('drawing');

//確定瀏覽器支持<canvas>元素
if( drawing.getContext ){

var context = drawing.getContext('2d');

//開始路徑
context.beginPath();

context.font = "bold 14px Arial";
context.textAlign = 'center';
context.textBaseline = 'middle';
context.fillText('12', 100, 20);
context.fillText('9', 20, 100);
context.fillText('6', 100, 140);
context.fillText('3', 180, 100);


//起點(diǎn)對齊
context.textAlign = "start";
context.fillText("12", 100, 40);

//終點(diǎn)對齊
context.textAlign = "end";
context.fillText('12',100,60);

//繪制外圓
context.arc(100, 100, 99, 0, 2 * Math.PI, false);

//繪制內(nèi)圓
context.moveTo(194, 100);
context.arc(100, 100, 94, 0, 2 * Math.PI, false);

//變換原點(diǎn)
context.translate(100, 100);

//旋轉(zhuǎn)表針
context.rotate(0.2);

//繪制分針
context.moveTo(0, 0);
context.lineTo(0, -85);

//繪制時(shí)針
context.moveTo(0, 0);
context.lineTo(-65, 0);

//描邊路徑
context.stroke();

}

15.2.6 繪制圖像

</img>

var drawing = document.getElementById('drawing');

//確定瀏覽器支持<canvas>元素
if( drawing.getContext ){

var context = drawing.getContext('2d');

var image = document.images[0];

context.drawImage(image, 20, 10, 50, 50, 260, 100, 40, 60);

}

15.2.7 陰影

var drawing = document.getElementById('drawing');

//確定瀏覽器支持<canvas>元素
if( drawing.getContext ){

var context = drawing.getContext('2d');


//設(shè)置陰影
context.shadowOffsetX = 10;                //x軸方向的陰影偏移量
context.shadowOffsetY = 10;                //y軸方向的陰影偏移量
context.shadowBlur = 4;                   //模糊的像素?cái)?shù)艺栈,默認(rèn)為0英岭,即不模糊
context.shadowColor = 'rgba(0,0,0,0.5)';  //陰影顏色,默認(rèn)為黑色

//繪制紅色矩形
context.fillStyle = "#ff0000";
context.fillRect(10,10,50,50);

//繪制藍(lán)色矩形
context.fillStyle = "rgba(0,0,255,1)";
context.fillRect(30,30,50,50);

}

15.2.8 漸變

(1) 橫向漸變

var drawing = document.getElementById('drawing');

//確定瀏覽器支持<canvas>元素
if( drawing.getContext ){

var context = drawing.getContext('2d');

var gradient = createRectLinearGradient(context,30,30,50,50);

gradient.addColorStop(0, 'white');
gradient.addColorStop(1, 'black');

//繪制紅色矩形
context.fillStyle = "#ff0000";
context.fillRect(10,10,50,50);

//繪制漸變矩形
context.fillStyle = gradient;
context.fillRect(30,30,50,50);

}

//確保漸變與形狀對齊
function createRectLinearGradient(context, x, y, width, height){
return context.createLinearGradient(x,y,x+width,y+height);
}

//徑向漸變(或放射漸變)

var drawing = document.getElementById('drawing');

//確定瀏覽器支持<canvas>元素
if( drawing.getContext ){

var context = drawing.getContext('2d');

var gradient = context.createRadialGradient(55,55,10,55,55,30);

gradient.addColorStop(0, 'white');
gradient.addColorStop(1, 'black');

//繪制紅色矩形
context.fillStyle = "#ff0000";
context.fillRect(10,10,50,50);

//繪制漸變矩形
context.fillStyle = gradient;
context.fillRect(30,30,50,50);

}

15.2.9 模式
模式其實(shí)就是重復(fù)的圖像湿右,可以用來填充或描邊圖形

</img>

var drawing = document.getElementById('drawing');

//確定瀏覽器支持<canvas>元素
if( drawing.getContext ){

var context = drawing.getContext('2d');

var image = document.images[0],
    pattern = context.createPattern(image, 'no-repeat');

//繪制矩形
context.fillStyle = pattern;
context.fillRect(10,10,150,150);

}

15.2.10 使用圖像數(shù)據(jù)

可以通過 getImageData() 取得原始圖像數(shù)據(jù)诅妹。這個(gè)方法接收4個(gè)參數(shù):
要取得其數(shù)據(jù)的畫面區(qū)域的x和y坐標(biāo)以及該區(qū)域的像素寬度和高度。

15.2.11 合成

15.3 WebGL

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末毅人,一起剝皮案震驚了整個(gè)濱河市吭狡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丈莺,老刑警劉巖划煮,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缔俄,居然都是意外死亡弛秋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門俐载,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蟹略,“玉大人,你說我怎么就攤上這事遏佣⊥诰妫” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵状婶,是天一觀的道長意敛。 經(jīng)常有香客問我,道長太抓,這世上最難降的妖魔是什么空闲? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任令杈,我火速辦了婚禮走敌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逗噩。我一直安慰自己掉丽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布异雁。 她就那樣靜靜地躺著捶障,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纲刀。 梳的紋絲不亂的頭發(fā)上荣倾,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機(jī)與錄音堪藐,去河邊找鬼卡啰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛阵子,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼取胎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了湃窍?” 一聲冷哼從身側(cè)響起闻蛀,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎您市,沒想到半個(gè)月后觉痛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡墨坚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年秧饮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泽篮。...
    茶點(diǎn)故事閱讀 38,664評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盗尸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帽撑,到底是詐尸還是另有隱情泼各,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布亏拉,位于F島的核電站扣蜻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏及塘。R本人自食惡果不足惜莽使,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望笙僚。 院中可真熱鬧芳肌,春花似錦、人聲如沸肋层。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栋猖。三九已至净薛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒲拉,已是汗流浹背肃拜。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工痴腌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人燃领。 一個(gè)月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓衷掷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親柿菩。 傳聞我的和親對象是個(gè)殘疾皇子戚嗅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 本章內(nèi)容 理解 元素 繪制簡單的 2D 圖形 使用 WebGL 繪制 3D 圖形 這個(gè)元素負(fù)責(zé)在頁面中設(shè)定一個(gè)區(qū)域...
    悶油瓶小張閱讀 843評論 0 0
  • 一:canvas簡介 1.1什么是canvas? ①:canvas是HTML5提供的一種新標(biāo)簽 ②:HTML5 ...
    GreenHand1閱讀 4,674評論 2 32
  • 熟悉html5的程序員們肯定都知道 元素枢舶,該元素是用來在頁面中規(guī)定一塊區(qū)域懦胞,然后由js在該區(qū)域內(nèi)繪制圖形。canv...
    米幾V閱讀 2,149評論 1 5
  • 列出二十樣你的生命無法或缺的事物凉泄。要誠實(shí)躏尉,你的手機(jī)可能是第一項(xiàng),繼續(xù)寫后众。十分鐘胀糜,開始。 男盆友 錢 食物 書 水 ...
    袁公子愛生活閱讀 140評論 0 0
  • 親愛的日課: 我對你是又愛又恨暗儆教藻! 愛的是,你的每一個(gè)問題都是我看書的動(dòng)力右锨,有了你括堤,我看書才有...
    春華秋實(shí)吧閱讀 161評論 0 1