Canvas繪圖

什么是Canvas?

<canvas> 是 HTML5 新增的元素历极,可使用JavaScript腳本來繪制圖形毁菱。例如:畫圖米死,合成照片,創(chuàng)建動畫甚至實時視頻處理與渲染贮庞。

開始之前

使用 <canvas> 元素不是非常難但你需要一些基本的HTML和JavaScript知識峦筒。<canvas> 元素不被一些老的瀏覽器所支持,但是所有的主流瀏覽器的新近版本都支持窗慎。Canvas 的默認大小為300像素×150像素(寬×高物喷,像素的單位是px)卤材。但是,可以使用HTML的高度和寬度屬性來自定義Canvas 的尺寸峦失。為了在 Canvas 上繪制圖形扇丛,我們使用一個JavaScript上下文對象,它能動態(tài)創(chuàng)建圖像( creates graphics on the fly)尉辑。

注意事項

雖然可以通過CSS來控制<canvas>大小帆精。但在渲染過程中<canvas>元素中的內容會根據(jù)情況縮放來適應需要的大小。如果您發(fā)現(xiàn)<canvas>元素中展示的內容變形隧魄,您可以通過內聯(lián)方式或通過JavaScript進行寬高相關設置卓练,而不要使用CSS。例:

<canvas id="canvas" width="300" height="300">
  Sorry, your browser doesn't support the &lt;canvas&gt; 

element.
</canvas>

下面開始canvas繪圖

初始化

var canvas=document.getElementById('canvas')
var context=canvas.getContext('2d')

繪圖為狀態(tài)繪圖堤器,應該先進行狀態(tài)設置昆庇,再選用函數(shù)進行具體繪制
因為canvas為狀態(tài)繪圖,則會導致在繪圖時之前的狀態(tài)設置也會同時進行設置闸溃,造成覆蓋

beginPath()和closePath()

beginPath():開始一條路徑整吆,或重置當前的路徑。
closePath():如果畫布的子路徑是打開的辉川,closePath() 通過添加一條線條連接當前點和子路徑起始點來關閉它表蝙。

線條屬性

  • lineCap :用于設置線條兩端形狀 只能用于線段的開始處和結尾處,不能用于連接處
    1. butt(default)
    2. round
    3. square
  • lineJoin:線條相交時的形態(tài)
    1. miter(default) miterLimit:內角和外角的最大值如果超過就用bevel方式顯示
    2. bevel
    3. round

繪制線條
線條屬性
多線條繪制

填充樣式 fillStyle

漸變色填充

  1. 線性漸變色
//Step1
var grd=context.createLinearGradient(xstart,ystart,xend,yend);
//Step2
//stop:浮點值 漸變色位置
grd.addColorStop(stop,color);

線性漸變

  1. 徑向漸變
var grd=context.createRadialGradient(x0,y0,r0,x1,y1,r1);
grd.addColorStop()

徑向漸變

  1. createPattern
createPattern(img,repeat-style)
repeat-style:no-repeat
            :repeat-x
             repeat=y
             repeat
createPattern(canvas,repeat-style)
createPattern(video,repeat-style)

曲線繪制

arc

context.arc(
    centerx,centery,radius,
    startingAngle,endingAngle,
    anticlockwise=false
)

centerx,centery:圓心坐標
radius:半徑
startingAngle乓旗,endingAngle:從哪一個弧度值為始府蛇,結束于哪一個弧度值
anticlockwise:順時針(false)繪制 逆時針時針繪制

圓形繪制

圓形繪制

arcTo

將當前的點坐標(moveTo等)傳入x1,y1,x2,y2后將會形成一個由兩個線段組成的折線,將從x0,y0開始繪制,x1,y1,x2,y2告訴圓弧用那兩條線當作切線屿愚,但是切點不一定在這兩條線段上


arcTo
context.moveTo(x0,y0);
context.arcTo(x1,y1,x2,y2,radius);

arcTo

貝塞爾二次曲線

context.moveTo(x0,y0);
context.quadraticCurveTo(x1,y1,x2,y2);

貝塞爾曲線

貝塞爾三次曲線

context.moveTo(x0,y0);
context.bezierCurveTo(
    x1,y1,x2,y2,x3,y3
)

貝塞爾三次曲線

文字渲染

context.font='bold 40px Arial'
context.fillText(string,x,y,[maxlen])

默認值:20px sans-serif
context.font 和css中font相同
文字渲染

文本對齊

//水平
context.textAlign='left/center/right'
//垂直
context.textBaseline='top/middle/bottom/alphabetic(Default基于拉丁語的基準線)/ideographic(基于中文汇跨、日文的基準線)/hanging(基于印度語的基準線)'

文本的度量

context.measureText(string).width

陰影

context.shadowColor
//陰影偏移量
context.shadowOffsetX
context.shadowOffsetY
//陰影模糊值
context.shadowBlur

陰影

全局

//全局透明度
context.globalAlpha

//繪制的圖像重疊時產(chǎn)生的效果
context.globalCompositeOperation='source-over(Default)/destination-over(先繪制的圖形在上面)'

剪輯區(qū)域

context.clip()

clip

非零環(huán)繞原則

Paste_Image.png

Paste_Image.png

參考資料:非零環(huán)繞原則
圓環(huán)繪制

圖形變換

  1. 位移:translate(x,y)
  2. 旋轉:rotate(deg)
  3. 縮放:scale(sx,sy) 不僅僅放大圖像大小,對坐標線條寬度等也會縮放
    圖形變換是疊加的
    canvas.save()/.restore():保存/返回圖形狀態(tài)
    transformation
    tarnsform

context原型

CanvasRenderingContext2d

圖形庫1
圖形庫2
圖形庫3

綜合應用

星星繪制
月亮繪制
星空繪制
運動的小球
倒計時

本文旨在記錄在初步學習canvas當中用到的一些方法妆距,個人認為canvas主要需要對圖形計算的熟悉穷遂,繪制圖形之前需要先計算好繪制的路徑,例如每個角的角度等等娱据,詳細學習路徑請查看
Canvas教程

文中代碼地址:
GitHub

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蚪黑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子中剩,更是在濱河造成了極大的恐慌忌穿,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件结啼,死亡現(xiàn)場離奇詭異掠剑,居然都是意外死亡,警方通過查閱死者的電腦和手機郊愧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門朴译,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沸伏,“玉大人,你說我怎么就攤上這事动分∫阍悖” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵澜公,是天一觀的道長姆另。 經(jīng)常有香客問我,道長坟乾,這世上最難降的妖魔是什么迹辐? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮甚侣,結果婚禮上明吩,老公的妹妹穿的比我還像新娘。我一直安慰自己殷费,他們只是感情好印荔,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著详羡,像睡著了一般仍律。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上实柠,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天水泉,我揣著相機與錄音,去河邊找鬼窒盐。 笑死草则,一個胖子當著我的面吹牛,可吹牛的內容都是我干的蟹漓。 我是一名探鬼主播炕横,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼牧牢!你這毒婦竟也來了看锉?” 一聲冷哼從身側響起姿锭,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤塔鳍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后呻此,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轮纫,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年焚鲜,在試婚紗的時候發(fā)現(xiàn)自己被綠了掌唾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片放前。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖糯彬,靈堂內的尸體忽然破棺而出凭语,到底是詐尸還是另有隱情,我是刑警寧澤撩扒,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布似扔,位于F島的核電站,受9級特大地震影響搓谆,放射性物質發(fā)生泄漏炒辉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一泉手、第九天 我趴在偏房一處隱蔽的房頂上張望黔寇。 院中可真熱鬧,春花似錦斩萌、人聲如沸缝裤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倘是。三九已至,卻和暖如春袭艺,著一層夾襖步出監(jiān)牢的瞬間搀崭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工猾编, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瘤睹,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓答倡,卻偏偏與公主長得像轰传,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瘪撇,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容

  • 本章內容 理解 元素 繪制簡單的 2D 圖形 使用 WebGL 繪制 3D 圖形 這個元素負責在頁面中設定一個區(qū)域...
    悶油瓶小張閱讀 836評論 0 0
  • 線條 var convas = document.getElementById('canvas'); var co...
    blue_angel閱讀 1,006評論 0 0
  • 一:canvas簡介 1.1什么是canvas获茬? ①:canvas是HTML5提供的一種新標簽 ②:HTML5 ...
    GreenHand1閱讀 4,663評論 2 32
  • getContext('2d') : canvas的2D繪圖環(huán)境 【直線與方塊】 1/fillRect(x,y,w...
    晨光2016閱讀 632評論 0 0
  • 最近又回到遺世孤立的狀態(tài)里恕曲,回放生命里過往的細水流年。醒來渤涌,或者睡前聽小娟幽遠的歌聲佩谣。COCO說,她也在聽实蓬。...
    葉落的聲音閱讀 630評論 0 0