CanvasRenderingContext2D 整理


CanvasAPI參考文檔推薦:

https://www.canvasapi.cn/

 

一、CanvasRenderingContext2D 屬性

canvas : 當前元素對象

globalAlpha: 全局透明度,范圍是0到1,范圍以外的值會被忽略

globalCompositeOperation: 可以用來設置Canvas圖形的混合模式。可以衍生很多其他效果,以及改變繪制圖形的上下層疊關系。

fillStyle :

color
使用純色填充,支持RGB,HSL,RGBA,HSLA以及HEX色值。
gradient
使用漸變填充,可以是線性漸變或者徑向漸變。
pattern
使用紋理填充。由於圖片也能作為紋理,因此fillStyle也能填充普通的位圖

文字設置:

font: value就是字號字體值,其規則和CSS的font很類似,除了一些很微小的細節差異,其他幾乎沒什么區別

textAlign:文本水平對齊方式,和CSS的text-align屬性值類似,支持left,right,centerstart,end這些值

textBaseline:指定文本對齊的基線,

其中value支持如下幾個關鍵字:

top
設定的垂直y坐標作為文本em區域(em區域可以看成中文字符占據的區域)的頂部。
hanging
hanging主要在藏文和其他印度文字中使用,我們了解即可。
middle
設定的垂直y坐標作為文本em區域的垂直中心位置。
alphabetic
默認值。表示的是正常文本的基線,可以看成是字母x的下邊緣。也就是設定的垂直y坐標就是字母x的下邊緣。
ideographic
ideographic主要在漢語、日語和韓語中使用。字面直譯是表意基線。含義為:如果字符的主體突出在字母基線之下,則這是字符主體的底部。例如漢字“中”比字母x位置更低,因此,底部是漢字主體的底部。
bottom
設定的垂直y坐標作為文本em區域的底部。

 

線段相關:
lineCap: 表示線條端點的樣式

butt
默認值,線的端點就像是個斷頭台,例如一條橫線,終點x坐標是100,則這條線的最右側邊緣就是100這個位置,沒有超出。
round
線的端點多出一個圓弧。
square
線的端點多出一個方框,框框的寬度和線一樣寬,高度是線厚度的一半。

lineDashOffset:value 表示虛線起始繪制的偏移距離,為浮點型,默認值是0.0。

lineJoin: 表示線條轉角的樣式,支持:miter,round,bevel
lineWidth:value 表示線的寬度。數值類型,默認值是1.0。如果是負數,0,NaN,或者Infinity都會忽略。

miterLimit:value表示多大范圍內轉角表現為miter的寬度。數值類型,默認值是10.0。如果是負數,0,NaN,或者Infinity都會忽略。

strokeStyle:可以是路徑的描邊,也可以是是形狀的描邊,也可以是文字的描邊。描邊的樣式也不僅限於顏色。

color
描邊設置為顏色。
gradient
描邊設置為漸變。
pattern
描邊設置為圖案。

 

陰影設置:

shadowBlur:可以用來指定陰影的模糊程度。默認值是0,表示不模糊。

shadowColor:可以用來指定陰影的顏色。默認值是透明黑,也就是看不到顏色,因此,如果我們想要使用陰影效果,shadowColor是必須要指定的。

shadowOffsetX:表示陰影的水平偏移大小。
shadowOffsetY:表示陰影的垂直偏移大小。

 

二、CanvasRenderingContext2D 方法

 

1.繪制文字

fileText()

用來填充文字,是Canvas繪制文本的主力方法。

context.fillText(text, x, y [, maxWidth]);
參數
各個參數含義和作用如下:

textString
用來填充的文本信息。
xNumber
填充文本的起點橫坐標。
yNumber
填充文本的起點縱坐標。
maxWidth(可選)Number ,指定最大寬度,每個文本寬度進行適合,而非換行

strokeText()

實現文本描邊效果。此描邊為居中描邊。

context.strokeText(text, x, y [, maxWidth]);

參數同上

 measureText()

可以用來測量文本的一些數據,返回 TextMetrics.

context.measureText(text)

返回值:TextMetrics,含有文本的寬度

TextMetrics.width
只讀。表示當前文本占據的CSS像素寬度。

 

2.繪制區域,繪制路徑

 stroke();   

context.stroke();
context.stroke(path);

參數
pathObject
指Path2D對象。IE瀏覽器不支持。

屬性關聯:lineWidth,strokeStyle

fill();

context.fill();
context.fill(fillRule);
context.fill(path, fillRule);

參數
各個參數含義和作用如下:

fillRuleString
填充規則。用來確定一個點實在路徑內還是路徑外。可選值包括:
nonzero:非零規則,此乃默認規則。
evenodd:奇偶規則。

pathObject
指Path2D對象。

屬性關聯:fillStyle

繪制路徑:

lineTo()  、moveTo() 、arcTo() 、quadraticCurveTo()、 bezierCurveTo() 、beginPath()、 closePath()

context.beginPath();
context.moveTo(50, 20);
context.lineTo(200, 100);
context.stroke();
context.beginPath();
context.moveTo(50, 50);
context.bezierCurveTo(100, 100, 200, 40, 250, 100);
context.stroke();
// 開始繪制
context.beginPath();
context.moveTo(50, 50);
context.quadraticCurveTo(100, 100, 250, 100);
context.stroke();
context.arcTo(x1, y1, x2, y2, radius);
context.quadraticCurveTo(cpx, cpy, x, y);
context.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);

strokeRect() 

context.strokeRect(x, y, width, height);

rect()  功能同 strokeRect()

arc() 

context.arc(x, y, radius, startAngle, endAngle [, anticlockwise]);

參數
各個參數含義和作用如下:

xNumber
圓弧對應的圓心橫坐標。
yNumber
圓弧對應的圓心縱坐標。
radiusNumber
圓弧的半徑大小。
startAngleNumber
圓弧開始的角度,單位是弧度。
endAngleNumber
圓弧結束的角度,單位是弧度。
anticlockwise(可選)Boolean
弧度的開始到結束的繪制是按照順時針來算,還是按時逆時針來算。如何設置為true,則表示按照逆時針方向從startAngle繪制到endAngle。
View Code

 

ellipse()

context.ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);

參數
各個參數含義和作用如下:

xNumber
橢圓弧對應的圓心橫坐標。
yNumber
橢圓弧對應的圓心縱坐標。
radiusXNumber
橢圓弧的長軸半徑大小。
radiusYNumber
橢圓弧的短軸半徑大小。
rotationNumber
橢圓弧的旋轉角度,單位是弧度。
startAngleNumber
圓弧開始的角度,角度從橫軸開始算,單位是弧度。
endAngleNumber
圓弧結束的角度,單位是弧度。
anticlockwise(可選)Boolean
弧度的開始到結束的繪制是按照順時針來算,還是按時逆時針來算。如何設置為true,則表示按照逆時針方向從startAngle繪制到endAngle。
View Code

 

setLineDash(),getLineDash()

ctx.setLineDash(segments);

參數
segmentsArray
數值列表數組。例如[5, 5],表示虛線的實線和透明部分長度是5像素和5像素。如果此參數值適合空數組[],則表示實線,常用來重置虛線設置。

context.getLineDash(); 
返回值是一個數組,數組里邊的值就是數字,稱為數字列表。所謂虛線,就是一段實線一段空隙交替出現的條線,而這里的數字列表中的值標識的就是交替實線和間歇的長度值。如果設置虛線的時候的數字是個奇數,則數組里邊的數字就會被復制和鏈接,這樣數量就變成偶數。

isPointInPath() ,isPointInStroke()

context.isPointInPath(x, y);
context.isPointInPath(x, y, fillRule);

// 下面語法IE不支持
context.isPointInPath(path, x, y);
context.isPointInPath(path, x, y, fillRule);

檢測點,是否在路徑上。

參數

此方法返回Boolean值。

參數
各個參數含義和作用如下:

xNumber
用來檢測的點的橫坐標。
yNumber
用來檢測的點的縱坐標。
fillRuleString
填充規則。用來確定一個點實在路徑內還是路徑外。可選值包括:
nonzero:非零規則,此乃默認規則。
evenodd:奇偶規則。
關於'nonzero'和'evenodd'規則可參見這篇文章。

pathObject
指Path2D對象。
// 登錄狀態下不會出現這行文字,點擊頁面右上角一鍵登錄
View Code
context.isPointInStroke(x, y);
context.isPointInStroke(path, x, y);
// 檢測點是否在描邊路徑上,描邊越粗,則檢測區域越大。
此方法返回Boolean值。

參數
各個參數含義和作用如下:

xNumber
用來檢測的點的橫坐標。
yNumber
用來檢測的點的縱坐標。
pathObject
指Path2D對象。
// 登錄狀態下不會出現這行文字,點擊頁面右上角一鍵登錄
View Code

 

繪制區域:

fillRect()

context.fillRect(x, y, width, height);

 

3.繪制圖片

 ImageData  像素信息數據 ,可以通過getImageData(),createImageData() 獲得

ImageData有如下符合規范標准的屬性。

ImageData.data
只讀。是一個包含RGBA像素信息的Uint8ClampedArray,數組中所有的值都是整數,范圍是0~255。
詳細 »
ImageData.height
只讀。是無符號長整數,表示ImageData對應的實際像素高度。
詳細 »
ImageData.width
只讀。是無符號長整數,表示ImageData對應的實際像素寬度。

createImageData()

context.createImageData(width, height); 
context.createImageData(imagedata);

返回值是ImageData對象,包含width,height和data這3個只讀屬性。參數具體含義如下:

widthNumber
ImageData對象包含的width值。如果ImageData對象轉換成圖像,則此width也是最終圖像呈現的寬度。
heightNumber
ImageData對象包含的height值。如果ImageData對象轉換成圖像,則此height也是最終圖像呈現的高度。
imagedataObject
一個存在的ImageData對象,只會使用該ImageData對象中的width和height值,包含的像素信息會全部轉換為透明黑。
View Code

getImageData()

context.getImageData(sx, sy, sWidth, sHeight);

putImageData()

context.putImageData(imagedata, dx, dy);
context.putImageData(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);

參數

各個參數含義和作用如下:

imagedataObject
包含圖像像素信息的ImageData對象。
dxNumber
目標Canvas中被圖像數據替換的起點橫坐標。
dyNumber
目標Canvas中被圖像數據替換的起點縱坐標。
dirtyX(可選)Number
圖像數據渲染區域的左上角橫坐標。默認值是0。
dirtyY(可選)Number
圖像數據渲染區域的左上角縱坐標。默認值是0。
dirtyWidth(可選)Number
圖像數據渲染區域的寬度。默認值是imagedata圖像的寬度。
dirtyHeight(可選)Number
圖像數據渲染區域的高度。默認值是imagedata圖像的高度。
關於參數,有必要再詳細解釋下。雖然看上去有9大參數,但不用慌,實際上可以就3類參數:

第1類就是imagedata,就是用來替換當前已有的Canvas畫布上的ImageData數據對象。
第2類就是dx,dy,這兩個參數是作用在Canvas畫布上的。imagedata你可以看成是一個即將貼在Canvas畫布上“圖片膏葯”,究竟貼在什么位置呢?dx,dy參數就是告訴這個膏葯,你的左上角位置就是這里。
需要注意的是,其坐標系並沒有發生任何變化。從效果表現上看,可以看成是臟矩形外面的像素被當做透明像素處理了。
View Code

drawImage()

context.drawImage(image, dx, dy);
context.drawImage(image, dx, dy, dWidth, dHeight);
context.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);
參數
各個參數含義和作用如下:

imageObject
繪制在Canvas上的元素,可以是各類Canvas圖片資源(見CanvasImageSource),如<img>圖片,SVG圖像,Canvas元素本身等。
dxNumber
在Canvas畫布上規划一片區域用來放置圖片,dx就是這片區域的左上角橫坐標。
dyNumber
在Canvas畫布上規划一片區域用來放置圖片,dy就是這片區域的左上角縱坐標。
dWidthNumber
在Canvas畫布上規划一片區域用來放置圖片,dWidth就是這片區域的寬度。
dHeightNumber
在Canvas畫布上規划一片區域用來放置圖片,dHeight就是這片區域的高度。
sxNumber
表示圖片元素繪制在Canvas畫布上起始橫坐標。
syNumber
表示圖片元素繪制在Canvas畫布上起始縱坐標。
sWidthNumber
表示圖片元素從坐標點開始算,多大的寬度內容繪制Canvas畫布上。
sHeightNumber
表示圖片元素從坐標點開始算,多大的高度內容繪制Canvas畫布上。
雖然看上去有9大參數,但不用慌,實際上可以就3類參數:

第1類就是image,同上,沒什么好說的;
第2類就是dx,dy,dWidth和dHeight,表示在Canvas畫布上划出一片區域用來放置圖片,dx,dy為canvas元素的左上角坐標,dWidth,dHeight指Canvas元素上用在顯示圖片的區域大小。如果沒有指定dx,dy,dWidth和dHeight這4個參數,則圖片會被拉伸或縮放在這片區域內。
第3類就是sx,sy,sWidth和sHeight,你可以理解為對原始圖片的提前剪裁。sx,sy表示圖片上sx,sy這個坐標作為剪裁的左上角,sWidth和sHeight尺寸范圍是最終剪裁出來的圖片尺寸。sx,sy,sWidth和sHeight這4個參數就可以得到一個剪裁好的新圖,然后我們把這個新圖放在dx,dy,dWidth和dHeight這個Canvas畫布區域中,就是最終的效果。另外,此處的所有坐標和寬高值都是相對於圖片的原始尺寸而言的。
View Code

CanvasImageSource

其運行的圖片資源類型包括下面這些:

HTMLImageElement
也即是HTML中常用的<img>元素,可以是頁面中的DOM對象,也可以是內存中創建的IMG對象。

SVGImageElement
也就是SVG中的<image>元素。該接口繼承關系如下圖:

HTMLVideoElement
也就是HTML5中的<video>元素。該接口繼承關系如下圖:

HTMLCanvasElement
也就是HTML5中的<canvas>元素,詳見這里。

ImageBitmap (部分瀏覽器不支持支持度)
ImageBitmap接口表示一個位圖圖像,可以將其繪制到Canvas而不會產生不適當的延遲。

OffscreenCanvas
此接口提供了一個可以在屏幕外渲染的Canvas畫布。它在window和worker上下文中都可用。使用示意:

var offscreen = new OffscreenCanvas(256, 256);
此接口兼容性比較差,且專為WebGL設計。本文檔旨在推廣Canvas 2D API,因此不展開。

 

4.縮放變形

translate(x,y)

坐標系移動變換中心,也就是畫布移動

scale(x,y)

坐標系縮放,也就是畫布縮放

rotate(angle)

默認旋轉中心點是Canvas的左上角(0, 0)坐標點,如果希望改變旋轉中心點,例如以Canvas畫布的中心旋轉,需要先使用translate()位移旋轉中心點。

角度轉弧度計算公式是:radian = degree * Math.PI / 180。例如,旋轉45°,旋轉弧度就是45 * Math.PI / 180。

// 旋轉45度
context.rotate(45 * Math.PI / 180);

 

transfrom(a,b,c,d,e,f);

此方法可以對畫布進行進一步變換,已實現,縮放,宣傳,拉伸,或者位移效果。

單位:

a,b,c,d 水平縮放,位移 都是倍數

e,f位移 單位像素

各個參數含義和作用如下:

aNumber
水平縮放。
bNumber
水平斜切。
cNumber
垂直斜切。
dNumber
垂直縮放。
eNumber
水平位移。
fNumber
垂直位移。
View Code

setTransform(a,b,c,d,e,f);

此方法和transform()方法的區別在於,后者不會完全重置已有的變換,而是累加。

 

5.漸變、圖案繪制

CanvasGradient 對象

 addColorStop(offset,color); 為漸變對象添加顏色值

各個參數含義和作用如下:

offsetNumber
漸變點相對於整個漸變范圍的偏移,范圍是0-1。
colorString
漸變點的顏色值。只要能被正確解析為CSS顏色的值都是合法的。
View Code

表示cavans中的漸變對象。

createLinearGradient(x0,y0,x1,y1);

可以用來創建線性漸變對象,需要注意的事,這里的漸變坐標是全局的,而不是填充元素計算的。

各個參數含義和作用如下:

x0Number
漸變起始點橫坐標。
y0Number
漸變起始點縱坐標。
x1Number
漸變結束點橫坐標。
y1Number
漸變結束點縱坐標。
View Code

createRadialGradient(x0,y0,r0,x1,y1,r1);

x0Number
起始圓的橫坐標。
y0Number
起始圓的縱坐標。
r0Number
起始圓的半徑。
x1Number
結束圓的橫坐標。
y1Number
結束圓的縱坐標。
r1Number
結束圓的半徑。
View Code

 

CanvasPattern   對象

表示cavans中的圖案對象。此對象沒有暴露屬性和方法。

createPattern( image,repetition);

各個參數含義和作用如下:

image Object
用來平鋪的CanvasImageSource圖像。可以是下面的類型:
HTMLImageElement,也就是<img>元素。
HTMLVideoElement,也就是<video>元素,例如捕獲攝像頭視頻產生的圖像信息。
HTMLCanvasElement
CanvasRenderingContext2D
ImageBitmap
ImageData
Blob
repetition  String
圖案的平鋪方式,可以是下面的值:
'repeat',水平和垂直平鋪。當repetition屬性值為空字符串''或者null,也會按照'repeat'進行渲染。
'repeat-x',僅水平平鋪。
'repeat-y',僅垂直平鋪。
'no-repeat',不平鋪。
View Code

 

6.其他常用方法

save(),restore()

保存狀態,回復狀態

clearRect(x,y,width,height);

把cavans元素畫布中的莫一塊矩形變成透明的。 清空像素。

clip()

表示路徑裁剪。使用的時候,先繪制裁路徑,然后執行 clip() 方法,再繪制的內容就在這個剪切路徑中呈現。

context.clip();
context.clip(fillRule);
context.clip(path, fillRule);
各個參數含義和作用如下:

fillRuleString
填充規則。用來確定一個點實在路徑內還是路徑外。可選值包括:
nonzero:非零規則。此乃默認規則。
evenodd:奇偶規則。
關於'nonzero'和'evenodd'規則可參見這篇文章。

pathObject
指Path2D對象。
View Code

 

 

 

更多:

HTMLCanvasElement 整理 

Canvas 實現圓圈進度展示/進度動畫 

canvas應用——將方形圖片處理為圓形 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM