用canvas繪圖

  • 1 基本用法
    要使用“<“canvas>元素街州,必須先設(shè)置其 width 和 height 屬性一疯,指定可以繪圖的區(qū)域大小灰粮。出現(xiàn)在 開始和結(jié)束標簽中的內(nèi)容是后備信息隶校,如果瀏覽器不支持”<“canvas>元素漏益,就會顯示這些信息。下面就 是“<”canvas>元素的例子深胳。
    “<”canvas id="drawing" width=" 200" height="200">A drawing of something.“<”/canvas>
    與其他元素一樣遭庶,“<”canvas>元素對應(yīng)的 DOM元素對象也有 width 和 height 屬性,可以隨意修 改稠屠。而且,也能通過 CSS為該元素添加樣式翎苫,如果不添加任何樣式或者不繪制任何圖形权埠,在頁面中是看 不到該元素的。
    要在這塊畫布(canvas)上繪圖煎谍,需要取得繪圖上下文攘蔽。而取得繪圖上下文對象的引用,需要調(diào)用 getContext()方法并傳入上下文的名字呐粘。傳入"2d"满俗,就可以取得 2D上下文對象转捕。
    在使用“<”canvas>元素之前,首先要檢測 getContext()方法是否存在唆垃,這一步非常重要五芝。有些瀏 覽器會為 HTML規(guī)范之外的元素創(chuàng)建默認的 HTML元素對象。在這種情況下辕万,即使 drawing 變量中 保存著一個有效的元素引用枢步,也檢測不到 getContext()方法。
    使用 toDataURL()方法渐尿,可以導(dǎo)出在“<”canvas>元素上繪制的圖像醉途。這個方法接受一個參數(shù),即圖 像的 MIME類型格式砖茸,而且適合用于創(chuàng)建圖像的任何上下文隘擎。
  • 2 2D上下文
    使用 2D繪圖上下文提供的方法,可以繪制簡單的 2D圖形凉夯,比如矩形货葬、弧線和路徑。2D上下文的 坐標開始于<canvas>元素的左上角恍涂,原點坐標是(0,0)宝惰。所有坐標值都基于這個原點計算,x值越大表示 越靠右再沧,y值越大表示越靠下尼夺。默認情況下,width 和 height 表示水平和垂直兩個方向上可用的像素 數(shù)目
  • 2.1 填充和描邊
    2D 上下文的兩種基本繪圖操作是填充和描邊炒瘸。填充淤堵,就是用指定的樣式(顏色、漸變或圖像)填 充圖形顷扩;描邊拐邪,就是只在圖形的邊緣畫線。大多數(shù) 2D上下文操作都會細分為填充和描邊兩個操作隘截,而操作的結(jié)果取決于兩個屬性:fillStyle 和 strokeStyle扎阶。
    這兩個屬性的值可以是字符串、漸變對象或模式對象婶芭,而且它們的默認值都是"#000000"东臀。如果為 它們指定表示顏色的字符串值,可以使用 CSS 中指定顏色值的任何格式犀农,包括顏色名惰赋、十六進制碼、 rgb呵哨、rgba赁濒、hsl 或 hsla
  • 2.2 繪制矩形
    矩形是唯一一種可以直接在 2D 上下文中繪制的形狀轨奄。與矩形有關(guān)的方法包括 fillRect()、 strokeRect()和 clearRect()拒炎。這三個方法都能接收 4個參數(shù):矩形的 x坐標挪拟、矩形的 y坐標、矩形 寬度和矩形高度枝冀。這些參數(shù)的單位都是像素舞丛。
  • 2.3 繪制路徑
    2D 繪制上下文支持很多在畫布上繪制路徑的方法。通過路徑可以創(chuàng)造出復(fù) 雜的形狀和線條果漾。要繪制路徑球切,首先必須調(diào)用 beginPath()方法,表示要開始 繪制新路徑绒障。然后吨凑,再通過調(diào)用下列方法來實際地繪制路徑。
    arc(x, y, radius, startAngle, endAngle, counterclockwise):以(x,y)為圓心繪 制一條弧線户辱,弧線半徑為 radius鸵钝,起始和結(jié)束角度(用弧度表示)分別為 startAngle 和 endAngle。后一個參數(shù)表示 startAngle 和 endAngle 是否按逆時針方向計算庐镐,值為 false 表示按順時針方向計算恩商。
    arcTo(x1, y1, x2, y2, radius):從上一點開始繪制一條弧線,到(x2,y2)為止必逆,并且以 給定的半徑 radius 穿過(x1,y1)怠堪。
    bezierCurveTo(c1x, c1y, c2x, c2y, x, y):從上一點開始繪制一條曲線,到(x,y)為 止名眉,并且以(c1x,c1y)和(c2x,c2y)為控制點粟矿。
    lineTo(x, y):從上一點開始繪制一條直線,到(x,y)為止损拢。
    moveTo(x, y):將繪圖游標移動到(x,y)陌粹,不畫線。
    quadraticCurveTo(cx, cy, x, y):從上一點開始繪制一條二次曲線福压,到(x,y)為止掏秩,并 且以(cx,cy)作為控制點。
    rect(x, y, width, height):從點(x,y)開始繪制一個矩形荆姆,寬度和高度分別由 width 和 height 指定蒙幻。這個方法繪制的是矩形路徑,而不是 strokeRect()和 fillRect()所繪制的獨 立的形狀胞枕。
    創(chuàng)建了路徑后,接下來有幾種可能的選擇魏宽。如果想繪制一條連接到路徑起點的線條腐泻,可以調(diào)用 closePath()决乎。如果路徑已經(jīng)完成,你想用 fillStyle 填充它派桩,可以調(diào)用 fill()方法构诚。另外,還可 以調(diào)用 stroke()方法對路徑描邊铆惑,描邊使用的是 strokeStyle范嘱。后還可以調(diào)用 clip(),這個方法 可以在路徑上創(chuàng)建一個剪切區(qū)域员魏。
  • 2.4 繪制文本
    文本與圖形總是如影隨形丑蛤。為此,2D 繪圖上下文也提供了繪制文本的方法撕阎。繪制文本主要有兩個 方法:fillText()和 strokeText()受裹。這兩個方法都可以接收 4 個參數(shù):要繪制的文本字符串、x 坐 標虏束、y坐標和可選的大像素寬度棉饶。而且,這兩個方法都以下列 3個屬性為基礎(chǔ)镇匀。
    font:表示文本樣式照藻、大小及字體,用 CSS中指定字體的格式來指定汗侵,例如"10px Arial"幸缕。
    textAlign:表示文本對齊方式』卧瘢可能的值有"start"冀值、"end"、"left"宫屠、"right"和"center"列疗。 建議使用"start"和"end",不要使用"left"和"right"浪蹂,因為前兩者的意思更穩(wěn)妥抵栈,能同時 適合從左到右和從右到左顯示(閱讀)的語言。
    textBaseline:表示文本的基線坤次」啪ⅲ可能的值有"top"、"hanging"缰猴、"middle"产艾、"alphabetic"、 "ideographic"和"bottom"。
    這幾個屬性都有默認值闷堡,因此沒有必要每次使用它們都重新設(shè)置一遍值隘膘。fillText()方法使用 fillStyle 屬性繪制文本,而 strokeText()方法使用 strokeStyle 屬性為文本描邊杠览。相對來說弯菊,還 是使用 fillText()的時候更多,因為該方法模仿了在網(wǎng)頁中正常顯示文本
  • 2.5 變換
    通過上下文的變換踱阿,可以把處理后的圖像繪制到畫布上管钳。2D繪制上下文支持各種基本的繪制變換。 創(chuàng)建繪制上下文時软舌,會以默認值初始化變換矩陣才漆,在默認的變換矩陣下,所有處理都按描述直接繪制葫隙。 為繪制上下文應(yīng)用變換栽烂,會導(dǎo)致使用不同的變換矩陣應(yīng)用處理,從而產(chǎn)生不同的結(jié)果恋脚。 可以通過如下方法來修改變換矩陣腺办。
    rotate(angle):圍繞原點旋轉(zhuǎn)圖像 angle 弧度。
    scale(scaleX, scaleY):縮放圖像糟描,在 x方向乘以 scaleX怀喉,在 y方向乘以 scaleY。scaleX 和 scaleY 的默認值都是 1.0船响。
    translate(x, y):將坐標原點移動到(x,y)躬拢。執(zhí)行這個變換之后,坐標(0,0)會變成之前由(x,y) 表示的點见间。
    transform(m1_1, m1_2, m2_1, m2_2, dx, dy):直接修改變換矩陣
    setTransform(m1_1, m1_2, m2_1, m2_2, dx, dy):將變換矩陣重置為默認狀態(tài)聊闯,然后 再調(diào)用 transform()
  • 2.6 繪制圖像
    2D繪圖上下文內(nèi)置了對圖像的支持。如果你想把一幅圖像繪制到畫布上米诉,可以使用 drawImage() 方法菱蔬。根據(jù)期望的終結(jié)果不同,調(diào)用這個方法時史侣,可以使用三種不同的參數(shù)組合拴泌。簡單的調(diào)用方式 是傳入一個 HTML <img>元素,以及繪制該圖像的起點的 x和 y坐標惊橱。
  • 2.7 陰影
    2D上下文會根據(jù)以下幾個屬性的值蚪腐,自動為形狀或路徑繪制出陰影。
    shadowColor:用 CSS顏色格式表示的陰影顏色税朴,默認為黑色回季。
    shadowOffsetX:形狀或路徑 x軸方向的陰影偏移量家制,默認為 0。
    shadowOffsetY:形狀或路徑 y軸方向的陰影偏移量泡一,默認為 0慰丛。
    shadowBlur:模糊的像素數(shù),默認 0瘾杭,即不模糊
  • 2.8 漸變
    漸變由 CanvasGradient 實例表示,很容易通過 2D上下文來創(chuàng)建和修改哪亿。要創(chuàng)建一個新的線性漸 變粥烁,可以調(diào)用 createLinearGradient()方法。這個方法接收 4個參數(shù):起點的 x坐標蝇棉、起點的 y坐 標讨阻、終點的 x 坐標、終點的 y 坐標篡殷。調(diào)用這個方法后钝吮,它就會創(chuàng)建一個指定大小的漸變,并返回 CanvasGradient 對象的實例板辽。
    創(chuàng)建了漸變對象后奇瘦,下一步就是使用 addColorStop()方法來指定色標。這個方法接收兩個參數(shù): 色標位置和 CSS顏色值劲弦。色標位置是一個 0(開始的顏色)到 1(結(jié)束的顏色)之間的數(shù)字耳标。
  • 2.9 模式
    模式其實就是重復(fù)的圖像,可以用來填充或描邊圖形邑跪。要創(chuàng)建一個新模式次坡,可以調(diào)用 createPattern()方法并傳入兩個參數(shù):一個 HTML <img>元素和一個表示如何重復(fù)圖像的字符串。 其中画畅,第二個參數(shù)的值與 CSS的 background-repeat 屬性值相同砸琅,包括"repeat"、"repeat-x"轴踱、 "repeat-y"和"no-repeat"
  • 2.10 使用圖像數(shù)據(jù)
    2D上下文的一個明顯的長處就是症脂,可以通過 getImageData()取得原始圖像數(shù)據(jù)。這個方法接收 4個參數(shù):要取得其數(shù)據(jù)的畫面區(qū)域的 x和 y坐標以及該區(qū)域的像素寬度和高度寇僧。
  • 2.11 合成
    還有兩個會應(yīng)用到 2D 上下文中所有繪制操作的屬性:globalAlpha 和 globalComposition- Operation摊腋。其中,globalAlpha 是一個介于 0和 1之間的值(包括 0和 1)嘁傀,用于指定所有繪制的透 明度兴蒸。默認值為 0上枕。如果所有后續(xù)操作都要基于相同的透明度般眉,就可以先把 globalAlpha 設(shè)置為適當(dāng) 值转晰,然后繪制,后再把它設(shè)置回默認值 0吏祸。
    第二個屬性 globalCompositionOperation 表示后繪制的圖形怎樣與先繪制的圖形結(jié)合。這個 屬性的值是字符串徘钥,可能的值如下
    source-over(默認值):后繪制的圖形位于先繪制的圖形上方派殷。
    source-in:后繪制的圖形與先繪制的圖形重疊的部分可見,兩者其他部分完全透明坚踩。
    source-out:后繪制的圖形與先繪制的圖形不重疊的部分可見荡灾,先繪制的圖形完全透明。
    source-atop:后繪制的圖形與先繪制的圖形重疊的部分可見瞬铸,先繪制圖形不受影響批幌。
    destination-over:后繪制的圖形位于先繪制的圖形下方,只有之前透明像素下的部分才可見嗓节。
    destination-in:后繪制的圖形位于先繪制的圖形下方荧缘,兩者不重疊的部分完全透明。
    destination-out:后繪制的圖形擦除與先繪制的圖形重疊的部分拦宣。
    destination-atop:后繪制的圖形位于先繪制的圖形下方截粗,在兩者不重疊的地方,先繪制的圖形會變透明鸵隧。
    ighter:后繪制的圖形與先繪制的圖形重疊部分的值相加绸罗,使該部分變亮。
    copy:后繪制的圖形完全替代與之重疊的先繪制圖形豆瘫。
    xor:后繪制的圖形與先繪制的圖形重疊的部分執(zhí)行“異或”操作从诲。
  • 3 WebGL
    WebGL是針對 Canvas的 3D上下文。與其他 Web 技術(shù)不同靡羡,WebGL并不是 W3C制定的標準系洛,而 是由 Khronos Group制定的。其官方網(wǎng)站是這樣介紹的:“Khronos Group是一個非盈利的由會員資助的 協(xié)會略步,專注于為并行計算以及各種平臺和設(shè)備上的圖形及動態(tài)媒體制定無版稅的開放標準描扯。 ” Khronos Group也設(shè)計了其他圖形處理 API,比如 OpenGL ES 2.0趟薄。瀏覽器中使用的 WebGL就是基于 OpenGL ES 2.0制定的绽诚。 OpenGL等 3D圖形語言是非常復(fù)雜的,本書不可能介紹其中每一個概念杭煎。熟悉 OpenGL ES 2.0的讀 者可能會覺得 WebGL更好理解一些恩够,因為好多概念是相通的。
  • 3.1 類型化數(shù)組
    WebGL涉及的復(fù)雜計算需要提前知道數(shù)值的精度羡铲,而標準的 JavaScript數(shù)值無法滿足需要蜂桶。為此,WebGL引入了一個概念也切,叫類型化數(shù)組(typed arrays)扑媚。類型化數(shù)組也是數(shù)組腰湾,只不過其元素被設(shè)置為 特定類型的值。 類型化數(shù)組的核心就是一個名為 ArrayBuffer 的類型疆股。每個 ArrayBuffer 對象表示的只是內(nèi)存 中指定的字節(jié)數(shù)费坊,但不會指定這些字節(jié)用于保存什么類型的數(shù)據(jù)。通過 ArrayBuffer 所能做的旬痹,就是 為了將來使用而分配一定數(shù)量的字節(jié)附井。
  • 3.2 WebGL上下文
    目前,在支持的瀏覽器中两残,WebGL 的名字叫"experimental-webgl"羡忘,這是因為 WebGL 規(guī)范仍 然未制定完成。制定完成后磕昼,這個上下文的名字就會變成簡單的"webgl"。如果瀏覽器不支持 WebGL节猿, 那么取得該上下文時會返回 null票从。在使用 WebGL上下文時,務(wù)必先檢測一下返回值滨嘱。
    通過給 getContext()傳遞第二個參數(shù)峰鄙,可以為 WebGL上下文設(shè)置一些選項。這個參數(shù)本身是一 個對象太雨,可以包含下列屬性吟榴。
    alpha:值為 true,表示為上下文創(chuàng)建一個 Alpha通道緩沖區(qū)囊扳;默認值為 true吩翻。
    depth:值為 true,表示可以使用 16位深緩沖區(qū)锥咸;默認值為 true狭瞎。
    stencil:值為 true,表示可以使用 8位模板緩沖區(qū)搏予;默認值為 false熊锭。
    antialias:值為 true,表示將使用默認機制執(zhí)行抗鋸齒操作雪侥;默認值為 true碗殷。
    premultipliedAlpha:值為 true,表示繪圖緩沖區(qū)有預(yù)乘 Alpha值速缨;默認值為 true锌妻。
    preserveDrawingBuffer:值為 true,表示在繪圖完成后保留繪圖緩沖區(qū)旬牲;默認值為 false从祝。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末襟己,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子牍陌,更是在濱河造成了極大的恐慌擎浴,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毒涧,死亡現(xiàn)場離奇詭異贮预,居然都是意外死亡,警方通過查閱死者的電腦和手機契讲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門仿吞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捡偏,你說我怎么就攤上這事唤冈。” “怎么了银伟?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵你虹,是天一觀的道長。 經(jīng)常有香客問我彤避,道長傅物,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任琉预,我火速辦了婚禮董饰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘圆米。我一直安慰自己卒暂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布娄帖。 她就那樣靜靜地躺著介却,像睡著了一般。 火紅的嫁衣襯著肌膚如雪块茁。 梳的紋絲不亂的頭發(fā)上齿坷,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音数焊,去河邊找鬼永淌。 笑死,一個胖子當(dāng)著我的面吹牛佩耳,可吹牛的內(nèi)容都是我干的遂蛀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼干厚,長吁一口氣:“原來是場噩夢啊……” “哼李滴!你這毒婦竟也來了螃宙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤所坯,失蹤者是張志新(化名)和其女友劉穎谆扎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芹助,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡堂湖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了状土。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片无蜂。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蒙谓,靈堂內(nèi)的尸體忽然破棺而出斥季,到底是詐尸還是另有隱情,我是刑警寧澤累驮,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布酣倾,位于F島的核電站,受9級特大地震影響慰照,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜琉朽,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一毒租、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧箱叁,春花似錦墅垮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至螟够,卻和暖如春灾梦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妓笙。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工若河, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寞宫。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓萧福,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辈赋。 傳聞我的和親對象是個殘疾皇子鲫忍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

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