JavaScript學(xué)習(xí)筆記整理(15):多媒體、Canvas和SVG

2018-06-19 13:57 更新
一、音頻(audio)和視頻(video)

在HTML5中引入了<audio>和<video>元素,用來在HTML文檔中嵌入音頻和視頻:

<audio src="m.mp3"/>

<video src="m.mp4" width=320 height=400 />

由于不同的瀏覽器對標(biāo)準(zhǔn)音頻和視頻的編解碼支持上并不一致,所以通常需要使用<source>元素來為指定不同格式的媒體源:

<audio id="music">

  <source src="m.mp3" type="audio/mpeg">

  <source src="m.ogg" type="audio/ogg;codec='vorbis'">

</audio>

<source>元素沒有任何內(nèi)容:沒有閉合的</source>標(biāo)簽,也需要使用“/>”來結(jié)束它們。


我們可以在<audio>和</audio>(或<video>和</video>)標(biāo)簽之間插入文本內(nèi)容,如果瀏覽器支持<audio>和<video>元素,將不會渲染文本內(nèi)容;而如果瀏覽器不支持時,則會將它們渲染出來。

<audio id="music">   

  <source src="m.mp3" type="audio/mpeg">   

  <source src="m.ogg" type="audio/ogg;codec='vorbis'">  

  您的瀏覽器不支持audio標(biāo)簽。

</audio>


1.1 HTML中媒體的屬性


(1)視頻(<video>)

autoplay    autoplay    如果出現(xiàn)該屬性,則視頻在就緒后馬上播放。

controls    controls    如果出現(xiàn)該屬性,則向用戶顯示控件,比如播放按鈕。

height      pixels      設(shè)置視頻播放器的高度。

width       pixels      設(shè)置視頻播放器的寬度。

loop        loop        如果出現(xiàn)該屬性,則循環(huán)播放。

muted       muted       如果出現(xiàn)該屬性,視頻的音頻輸出為靜音。

poster      URL         規(guī)定視頻正在下載時顯示的圖像,直到用戶點擊播放按鈕。 preload     auto/metadata/none   如果出現(xiàn)該屬性,則視頻在頁面加載時進(jìn)行加載,并預(yù)備播放。如果使用 "autoplay",則忽略該屬性。

src         URL         要播放的視頻的 URL。


(2)音頻(<audio>)

autoplay    autoplay    如果出現(xiàn)該屬性,則視頻在就緒后馬上播放。

controls    controls    如果出現(xiàn)該屬性,則向用戶顯示控件,比如播放按鈕。

loop        loop        如果出現(xiàn)該屬性,則當(dāng)媒介文件完成播放后再次開始播放。

muted       muted       如果出現(xiàn)該屬性,視頻的音頻輸出為靜音。

preload     auto/metadata/none    如果出現(xiàn)該屬性,則視頻在頁面加載時進(jìn)行加載,并預(yù)備播放。如果使用 "autoplay",則忽略該屬性。

src         URL         要播放的視頻的 URL。


1.2 用JavaScript操作音頻和視頻

audio可以通過new創(chuàng)建Audio對象

var music = new Audio('m.mp3');

還可以通過標(biāo)簽獲取<audio>或<video>元素,即獲得HTMLVideoElement和HTMLAudioElement對象:

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

檢測瀏覽器是否支持

var hasAudio = !!(music.canPlayType); //通過!!運(yùn)算符將結(jié)果轉(zhuǎn)換成布爾值


(1)屬性

只讀屬性:

duration   整個媒體文件的播放時長,以秒為單位。如果無法獲取時長,則返回NaN  

paused     如果媒體文件當(dāng)前被暫停,則返回true。如果還未開始播放,默認(rèn)返回true  

ended      如果媒體文件已經(jīng)播放完畢,則返回true  

startTime  返回最早的播放起始時間,一般是0.0,除非是緩沖過的媒體文件,并且一部分內(nèi)容已經(jīng)不在緩沖區(qū)  

error      在發(fā)生了錯誤的情況下返回的錯誤代碼  

currentSrc 以字符串形式返回當(dāng)前正在播放或已加載的文件。對應(yīng)于瀏覽器在source元素中選擇的文件

seeking    如果播放器正在跳到一個新的播放點,那seeking的值為true。

initialTime  指定了媒體的開始時間,單位為秒

可讀寫屬性:

autoplay     將媒體文件設(shè)置為創(chuàng)建后自動播放,或者查詢是否已設(shè)置為autoplay  

loop         返回是否循環(huán)播放,或設(shè)置循環(huán)播放(或者不循環(huán)播放)  

currentTime  指定了播放器應(yīng)該跳過播放的時間(單位為秒)。在播放過程中,可設(shè)置currentTime屬性來進(jìn)行定點播放。

controls     顯示或隱藏用戶控制界面,或者查詢用戶控制界面當(dāng)前是否可見  

volume       在0.0到1.0之間設(shè)置音頻音量的相對值,或者查詢當(dāng)前音量相對值  

muted        布爾值,設(shè)置靜音或者消除靜音,或者檢測當(dāng)前是否為靜音  

autobuffer   通知播放器在媒體文件開始播放前,是否驚醒緩沖加載。如果已設(shè)置為autoplay,則忽略此特性

playbackRate  用于指定媒體播放的速度。1.0表示正常速度,大于1則表示“快進(jìn)”,0~1之間表示“慢放”,負(fù)值表示回放。

三個特殊屬性:

played 返回已經(jīng)播放的時間段  

buffered 返回當(dāng)前已經(jīng)緩沖的時間段  

seekable 返回當(dāng)前播放器需要跳到的時間段

played、buffered和seekable都是TimeRanges對象,每個對象都有一個length屬性以及start(index)和end(index)方法,前者表示當(dāng)前一個時間段,后者分別返回當(dāng)前時間段的起始時間點和結(jié)束時間點(單位為秒)。


還有另外三個屬性:

readyState、networkState和error,它們包含<audio>和<video>元素的一些狀態(tài)細(xì)節(jié)。每個屬性都是數(shù)字類型的,而且為每個有效值都定義了對應(yīng)的常量。


readyState屬性指定當(dāng)前已經(jīng)加載了多少媒體內(nèi)容,只讀屬性

HAVE_NOTHING(數(shù)字值為0):沒有獲取到媒體的任何信息,當(dāng)前播放位置沒有可播放數(shù)據(jù)。  

HAVE_METADATA(數(shù)字值為1):已經(jīng)獲取到足夠的媒體數(shù)據(jù),但是當(dāng)前播放位置沒有有效的媒體數(shù)據(jù)(也就是說,獲取到的媒體數(shù)據(jù)無效,不能播放)。  

HAVE_CURRENT_DATA(數(shù)字值為2):當(dāng)前播放位置已經(jīng)有數(shù)據(jù)可以播放,但沒有獲致到可以讓播放器前進(jìn)的數(shù)據(jù)。當(dāng)媒體為視頻時,意思是當(dāng)前帖的數(shù)據(jù)已獲取,但沒有獲取到下一幀的數(shù)據(jù),或者當(dāng)前幀已經(jīng)是播放的最重一幀。  

HAVE_FUTURE_DATA(數(shù)字值為3):當(dāng)前播放位置已經(jīng)有數(shù)據(jù)可以播放,而且也獲取到了可以讓播放器前進(jìn)的數(shù)據(jù)。當(dāng)媒體為視頻時,意思是當(dāng)前幀的數(shù)據(jù)已獲取,而且也獲取到了下刺目販數(shù)據(jù),當(dāng)前幀是播放的最后一幀時,readyState屬性不可能為HAVE_FUTURE_DTAT。  HAVE_ENOUGH)DATA(數(shù)字值為4):當(dāng)前播放位置已經(jīng)有數(shù)據(jù)可以播放,同時也獲取到了可以讓播放器前進(jìn)的數(shù)據(jù),而且瀏覽器確認(rèn)媒體以某一種速度進(jìn)行加載,可以保證有足夠的后續(xù)數(shù)據(jù)進(jìn)行播放。


networkState屬性

networkState屬性讀取當(dāng)前的網(wǎng)絡(luò)狀態(tài),共有如下所示的4個可能值:

NETWORK_EMPTY(數(shù)字值為0):元素牌初始狀態(tài)。  

NETWORK_IDLE(數(shù)字值為1):瀏覽器已選擇好用什么編碼格式來播放媒體,但尚未建立網(wǎng)絡(luò)連接。  

NETWORK_LOADING(數(shù)字值為2):媒體數(shù)據(jù)加載中。  

NETWORK_NO_SOURCE(數(shù)字值為3):沒有支持的編碼格式,不執(zhí)行加載。


error屬性

當(dāng)在加載媒體或者播放媒體過程中發(fā)生錯誤時,瀏覽器就會設(shè)置<audio>或<video>元素的error屬性。在沒有錯誤發(fā)生時,error屬性值為null。反之,error的屬性是一個對象,包含了描述錯誤的數(shù)值code屬性,error.code可能的值:

MEDIA_ERR_ABORTED(數(shù)字值為1):媒體數(shù)據(jù)的下載過程由于用戶的操作原因而被中止。  

MEDIA_ERR_NETWORK(數(shù)字值為2):確認(rèn)媒體資源可用,但是在下載時出現(xiàn)網(wǎng)絡(luò)錯誤,媒體數(shù)據(jù)下載過程被中止。  

MEDIA_ERR_DECODE(數(shù)字值為3):確認(rèn)媒體資源可能,但是解碼時發(fā)生錯誤。  

MEDIA_ERR_SRC_NOT_SUPPORTED(數(shù)字值為4):媒體格式不被支持。


video的額外屬性:

poster 在視頻加載完成之前,代表視頻內(nèi)容的圖片的URL地址。該特性可讀可修改  

width、height 讀取或設(shè)置顯示尺寸。如果大小不匹配視頻本身,會導(dǎo)致邊緣出現(xiàn)黑色條狀區(qū)域  

videoWidth、videoHeight 返回視頻的固有或自使用寬度和高度。只讀


(2)方法

canPlayType(type)方法將媒體的MIME類型作為參數(shù),用來測試瀏覽器是否支持指定的媒體類型。如果它不能播放該類型的媒體文件,將返回一個空的字符串;反之,它會返回一個字符串:“maybe”或“probably”。

var a = new Audio();

if(a.canPlayType('audio/wav')){

  a.src = 'm.wav';

  a.play();

}

其他方法:

play()   控制媒體開始播放

pause()  暫停媒體播放

load()   重新加載src指定的資源


(3)事件

audio元素和video元素加載音頻和視頻時,以下事件按次序發(fā)生。

loadstart:開始加載音頻和視頻。  

durationchange:音頻和視頻的duration屬性(時長)發(fā)生變化時觸發(fā),即已經(jīng)知道媒體文件的長度。如果沒有指定音頻和視頻文件,duration屬性等于NaN。如果播放流媒體文件,沒有明確的結(jié)束時間,duration屬性等于Inf(Infinity)。  

loadedmetadata:媒體文件的元數(shù)據(jù)加載完畢時觸發(fā),元數(shù)據(jù)包括duration(時長)、dimensions(大小,視頻獨(dú)有)和文字軌。  

loadeddata:媒體文件的第一幀加載完畢時觸發(fā),此時整個文件還沒有加載完。  

progress:瀏覽器正在下載媒體文件,周期性觸發(fā)。下載信息保存在元素的buffered屬性中。  

canplay:瀏覽器準(zhǔn)備好播放,即使只有幾幀,readyState屬性變?yōu)镃AN_PLAY。  

canplaythrough:瀏覽器認(rèn)為可以不緩沖(buffering)播放時觸發(fā),即當(dāng)前下載速度保持不低于播放速度,readyState屬性變?yōu)镃AN_PLAY_THROUGH。

除了上面這些事件,audio元素和video元素還支持以下事件。

abort 播放中斷  

emptied 媒體文件加載后又被清空,比如加載后又調(diào)用load方法重新加載。  

ended 播放結(jié)束  

error 發(fā)生錯誤。該元素的error屬性包含更多信息。  

pause 播放暫停  

play 暫停后重新開始播放  

playing 開始播放,包括第一次播放、暫停后播放、結(jié)束后重新播放。  

ratechange 播放速率改變  

seeked 搜索操作結(jié)束  

seeking 搜索操作開始  

stalled 瀏覽器開始嘗試讀取媒體文件,但是沒有如預(yù)期那樣獲取數(shù)據(jù)  

suspend 加載文件停止,有可能是播放結(jié)束,也有可能是其他原因的暫停  

timeupdate 網(wǎng)頁元素的currentTime屬性改變時觸發(fā)。  

volumechange 音量改變時觸發(fā)(包括靜音)。  

waiting 由于另一個操作(比如搜索)還沒有結(jié)束,導(dǎo)致當(dāng)前操作(比如播放)不得不等待。


二、canvas

HTML5<canvas>元素用于圖形的繪制,通過腳本 (通常是JavaScript)來完成。

<canvas> 標(biāo)簽只是圖形容器,您必須使用腳本來繪制圖形。


要使用Canvas API,首先需要新建一個<canvas>網(wǎng)頁元素

<canvas id="canvas" width="400" height="200">

  您的瀏覽器不支持canvas!

</canvas>

width 和 height 屬性定義的畫布的大小。

接著,我們可以通過標(biāo)簽選擇獲取到<canvas>元素:

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

然后,創(chuàng)建context對象:

if(canvas.getContext){

  var ctx = canvas.getContext('2d');

}

調(diào)用getContext()方法時,傳遞一個“2d”參數(shù),會獲得一個CanvasRenderingContext2D對象,使用該對象可以在畫布上繪制二維圖形。我們也可將CanvasRenderingContext2D簡稱為“上下文對象”。


2.1 canvas的繪圖用法

canvas畫布提供了一個用來作圖的平面空間,該空間的每個點都有自己的坐標(biāo),x表示橫坐標(biāo),y表示豎坐標(biāo)。原點(0, 0)位于圖像左上角,x軸的正向是原點向右,y軸的正向是原點向下。


(1)繪制矩形

rect(x,y,width,height)方法用來繪制矩形。


fillRect(x, y, width, height)方法用來繪制矩形,它的四個參數(shù)分別為矩形左上角頂點的x坐標(biāo)、y坐標(biāo),以及矩形的寬和高。fillStyle屬性用來設(shè)置矩形的填充色。


strokeRect(x, y, width, height)方法同樣是繪制矩形,但只畫線不填充,也可以說是畫空心矩形。strokeStyle屬性用來設(shè)置矩形的繪制色。


clearRect(x, y, width, height)方法用來清除某個矩形區(qū)域的內(nèi)容。


(2)繪制圓形和扇形

arc(x, y, radius, startAngle, endAngle, anticlockwise)方法用來繪制圓形和扇形。

arc方法的x和y參數(shù)是圓心坐標(biāo),radius是半徑,startAngle和endAngle則是扇形的起始角度和終止角度(以弧度表示),anticlockwise表示做圖時應(yīng)該逆時針畫(true)還是順時針畫(false)。


arcTo(x1,y1,x2,y2,r)方法在畫布上創(chuàng)建介于兩個切線之間的弧/曲線。

參數(shù):x1 弧的起點的 x 坐標(biāo),y1 弧的起點的 y 坐標(biāo),x2 弧的終點的 x 坐標(biāo),y2 弧的終點的 y 坐標(biāo),r 弧的半徑。


(3)繪制文本

fillText(string, x, y) 用來繪制文本,它的三個參數(shù)分別為文本內(nèi)容、起點的x坐標(biāo)、y坐標(biāo)。使用之前,需用font設(shè)置字體、大小、樣式(寫法類似與CSS的font屬性)。

strokeText(string,x,y)方法,用來添加空心字。

// 設(shè)置字體  

ctx.font = "Bold 20px Arial";   

// 設(shè)置對齊方式,start、end、right、center

ctx.textAlign = "left";  

// 設(shè)置填充顏色  

ctx.fillStyle = "#008600"; 

//設(shè)置垂直對齊方式,top、hanging、middle、alphabetic、ideographic、bottom

ctx.textBaseline = top;

我們還可以計算字體寬度(px):

var name = 'aaa';

ctx.measureText(name);

measureText() 方法返回包含一個對象,該對象包含以像素計的指定字體寬度。

ctx.measureText(name).width


(4)繪制路徑

beginPath()方法表示開始繪制路徑,moveTo(x, y)方法設(shè)置線段的起點,lineTo(x, y)方法設(shè)置線段的終點,stroke()方法用來給透明的線段著色。

ctx.beginPath(); // 開始路徑繪制  

ctx.moveTo(20, 20); // 設(shè)置路徑起點,坐標(biāo)為(20,20)  

ctx.lineTo(200, 20); // 繪制一條到(200,20)的直線  

ctx.lineWidth = 1.0; // 設(shè)置線寬  

ctx.strokeStyle = '#CC0000'; // 設(shè)置線的顏色  

ctx.stroke(); // 進(jìn)行線的著色,這時整條線才變得可見

moveTo()和lineTo()方法可以多次使用。


注意:如果使用closePath()方法,會自動繪制一條當(dāng)前點到起點的直線,形成一個封閉圖形。


fill()stroke()分別填充當(dāng)前繪圖(路徑)和繪制已定義的路徑。


isPointInPath()

isPointInPath(x,y);

如果指定的點位于當(dāng)前路徑中,isPointInPath() 方法返回 true,否則返回 false。


clip()

clip()方法從原始畫布中剪切任意形狀和尺寸。

注意:一旦剪切了某個區(qū)域,則所有之后的繪圖都會被限制在被剪切的區(qū)域內(nèi)(不能訪問畫布上的其他區(qū)域)。您也可以在使用 clip() 方法前通過使用 save() 方法對當(dāng)前畫布區(qū)域進(jìn)行保存,并在以后的任意時間對其進(jìn)行恢復(fù)(通過 restore() 方法)。


closePath()方法創(chuàng)建當(dāng)前點回到起始點的路徑。


其他樣式屬性:

lineCap 設(shè)置或返回線條的結(jié)束端點樣式,可能值: butt|round|square(平直邊緣|圓形線帽|正方形線帽) 

lineJoin 設(shè)置或返回兩條線相交時,所創(chuàng)建的拐角類型,可能值:bevel|round|miter(斜角|圓角|尖角(默認(rèn)值))

lineWidth 設(shè)置或返回當(dāng)前的線條寬度。  

miterLimit 正數(shù),設(shè)置或返回最大斜接長度。如果斜接長度超過 miterLimit 的值,邊角會以 lineJoin 的 "bevel" 類型來顯示。


fillStyle  設(shè)置填充色

strokeStyle  設(shè)置繪制線色

顏色格式:

//可直接用顏色名稱

'red' 'green'

//十六進(jìn)制顏色

'#d9d9d9'

//rgb

rgb(0,0,0)

//rgba

rgba(0,0,0,1)


(5)設(shè)置漸變色

線性漸變

createLinearGradient方法用來設(shè)置漸變色。

var gradient = ctx.createLinearGradient(0, 0, 0, 160);    

gradient.addColorStop(0, "#BABABA");    

gradient.addColorStop(1, "#636363");

createLinearGradient()方法的參數(shù)是(x1, y1, x2, y2),其中x1和y1是起點坐標(biāo),x2和y2是終點坐標(biāo)。通過不同的坐標(biāo)值,可以生成從上至下、從左到右的漸變等等。

使用方法:

ctx.fillStyle = myGradient;  

ctx.fillRect(10,10,200,100);


環(huán)形漸變

createRadialGradient()方法的參數(shù)是(x0,y0,r0,x1,y1,r1),其中x0 漸變的開始圓的 x 坐標(biāo),y0 漸變的開始圓的 y 坐標(biāo),r0 開始圓的半徑,x1 漸變的結(jié)束圓的 x 坐標(biāo),y1 漸變的結(jié)束圓的 y 坐標(biāo),r1 結(jié)束圓的半徑。

var grd=ctx.createRadialGradient(75,50,5,90,60,100);  

grd.addColorStop(0,"red");  

grd.addColorStop(1,"white");   

  

ctx.fillStyle=grd;  

ctx.fillRect(10,10,150,100);


(6)設(shè)置陰影

我們還可以設(shè)置陰影

ctx.shadowOffsetX = 10; // 設(shè)置水平位移  

ctx.shadowOffsetY = 10; // 設(shè)置垂直位移  

ctx.shadowBlur = 5; // 設(shè)置模糊度  

ctx.shadowColor = "rgba(0,0,0,0.5)"; // 設(shè)置陰影顏色   


ctx.fillStyle = "#CC0000";   

ctx.fillRect(10,10,200,100);


(7)合成

globalAlpha 屬性設(shè)置或返回繪圖的當(dāng)前透明值(alpha 或 transparency)。

globalAlpha 屬性值必須是介于 0.0(完全透明) 與 1.0(不透明) 之間的數(shù)字。

ctx.globalAlpha = number


globalCompositeOperation屬性設(shè)置或返回如何將一個源(新的)圖像繪制到目標(biāo)(已有的)的圖像上。

源圖像 = 您打算放置到畫布上的繪圖。

目標(biāo)圖像 = 您已經(jīng)放置在畫布上的繪圖。

source-over 默認(rèn)。在目標(biāo)圖像上顯示源圖像。  

source-atop 在目標(biāo)圖像頂部顯示源圖像。源圖像位于目標(biāo)圖像之外的部分是不可見的。  

source-in 在目標(biāo)圖像中顯示源圖像。只有目標(biāo)圖像之內(nèi)的源圖像部分會顯示,目標(biāo)圖像是透明的。  

source-out 在目標(biāo)圖像之外顯示源圖像。只有目標(biāo)圖像之外的源圖像部分會顯示,目標(biāo)圖像是透明的。  

destination-over 在源圖像上顯示目標(biāo)圖像。  

destination-atop 在源圖像頂部顯示目標(biāo)圖像。目標(biāo)圖像位于源圖像之外的部分是不可見的。  

destination-in 在源圖像中顯示目標(biāo)圖像。只有源圖像之內(nèi)的目標(biāo)圖像部分會被顯示,源圖像是透明的。  

destination-out 在源圖像之外顯示目標(biāo)圖像。只有源圖像之外的目標(biāo)圖像部分會被顯示,源圖像是透明的。  

lighter 顯示源圖像 + 目標(biāo)圖像。  

copy 顯示源圖像。忽略目標(biāo)圖像。  

xor 使用異或操作對源圖像與目標(biāo)圖像進(jìn)行組合。


2.2 繪制圖像

Canvas API 允許將圖像文件插入畫布。


我們可以使用Image對象來加載圖片,然后繪制:

var image = new Image();

image.onload = function(){

    ctx.drawImage(image,0,0);

};

image.src='new.jpg';

drawImage方法

drawImage(img,x,y)


drawImage(img,x,y,width,height)


drawImage(img,sx,sy,switch,sheight,x,y,width,height)

參數(shù):

img 規(guī)定要使用的圖像、畫布或視頻;sx 可選,開始剪切的 x 坐標(biāo)位置;sy 可選,開始剪切的 y 坐標(biāo)位置;swidth 可選,被剪切圖像的寬度;sheight 可選,被剪切圖像的高度;x 表示在畫布上放置圖像的 x 坐標(biāo)位置;y 在畫布上放置圖像的 y 坐標(biāo)位置;width 可選,表示要使用的圖像的寬度(伸展或縮小圖像);height 可選,表示要使用的圖像的高度(伸展或縮小圖像)。


圖像平鋪

createPattern(image,type)

參數(shù):

 type: no-repeat:不平鋪 ;repeat-x:橫方向平鋪;repeat-y:縱方向平鋪;repeat:全方向平鋪


2.3 像素處理

通過getImageData方法和putImageData方法,可以處理每個像素,進(jìn)而操作圖像內(nèi)容。


getImageData()方法可以用來讀取Canvas的內(nèi)容,返回一個對象,包含了每個像素的信息。

var imageData = ctx.getImageData(x,y,w,h)

參數(shù):x是canvas的X軸坐標(biāo),y是canvas的Y軸坐標(biāo),w是寬度,h是高度。

getImageData()方法返回一個像素顏色數(shù)組(該數(shù)組的長度等于圖像的像素寬度*圖像的像素高度*4,每個值的范圍是0-255,可讀寫),imageData的屬性data就是指向它,順序是所取像素范圍的從左到右,從上到下,數(shù)組的元素是(所有圖形,包括圖片,和繪制的圖形)每個像素的rgba  :

[r1,g1,b1,a1,r2,g2,b2,a2...]


putImageData()方法可將數(shù)組內(nèi)容重新繪制到Canvas上。

putImageData(imgData,x,y,dirtyX,dirtyY,dirtyWidth,dirtyHeight);

參數(shù):imgData 規(guī)定要放回畫布的 ImageData 對象;x 是ImageData 對象左上角的 x 坐標(biāo),以像素計;y 是ImageData 對象左上角的 y 坐標(biāo),以像素計;dirtyX 可選,水平值(x),以像素計,在畫布上放置圖像的位置;dirtyY 可選,垂直值(y),以像素計,在畫布上放置圖像的位置;dirtyWidth 可選,在畫布上繪制圖像所使用的寬度;dirtyHeight 可選,在畫布上繪制圖像所使用的高度。


當(dāng)然,我們也可以創(chuàng)建一個空白的ImageData對象。

var imgData=context.createImageData(width,height);

也可創(chuàng)建與指定的另一個ImageData對象尺寸相同的新ImageData對象(其不會復(fù)制圖像數(shù)據(jù)):

var imgData=context.createImageData(imageData);

ImageData對象有data屬性,它包含 color/alpha 信息的數(shù)組。


2.4 保存與恢復(fù)

save()方法用于保存上下文環(huán)境,restore()方法用于恢復(fù)到上一次保存的上下文環(huán)境。


2.5 保存圖像

我們可以使用toDataURL()方法將Canvas數(shù)據(jù)重新轉(zhuǎn)化成圖像文件形式:

canvas.toDataURL('image/png')

上面的代碼將Canvas數(shù)據(jù),轉(zhuǎn)化成PNG data URI。


2.6 轉(zhuǎn)換

(1)scale()

scale() 方法縮放當(dāng)前繪圖至更大或更小。

scale(scalewidth,scaleheight)

參數(shù):scalewidth 縮放當(dāng)前繪圖的寬度;scaleheight 縮放當(dāng)前繪圖的高度。


注意:如果您對繪圖進(jìn)行縮放,所有之后的繪圖也會被縮放。定位也會被縮放。如果您 scale(2,2),那么繪圖將定位于距離畫布左上角兩倍遠(yuǎn)的位置。


(2)rotate()

rotate() 方法旋轉(zhuǎn)當(dāng)前的繪圖。

rotate(angle)

參數(shù):angle 旋轉(zhuǎn)角度,以弧度計。

注意:旋轉(zhuǎn)只會影響到旋轉(zhuǎn)完成后的繪圖。


(3)translate()

translate() 方法重新映射畫布上的 (0,0) 位置。

translate(x,y)

參數(shù):x 添加到水平坐標(biāo)(x)上的值;y 添加到垂直坐標(biāo)(y)上的值。


(4)transform()

transform(a,b,c,d,e,f)

參數(shù):a 水平縮放繪圖,b 水平傾斜繪圖,c 垂直傾斜繪圖,d 垂直縮放繪圖,e 水平移動繪圖,f 垂直移動繪圖。


(5)setTransform()

setTransform() 方法把當(dāng)前的變換矩陣重置為單位矩陣,然后以相同的參數(shù)運(yùn)行 transform()。

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

參數(shù):a 水平縮放繪圖,b 水平傾斜繪圖,c 垂直傾斜繪圖,d 垂直縮放繪圖,e 水平移動繪圖,f 垂直移動繪圖。

注意:該變換只會影響 setTransform() 方法調(diào)用之后的繪圖。


2.7 動畫

我們可以使用setInterval()setTimeout()來產(chǎn)生動畫效果。


還可以使用requestAnimationFrame()來制作動畫。

requestAnimationFrame()函數(shù)是全局函數(shù)。

考慮兼容,如下:

var requestAnimFrame = function() {   

  return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(a) {window.setTimeout(a, 1e3 / 60, (new Date).getTime())};   

}();

使用方法:

function step(){

  requestAnimationFrame(step);

}

requestAnimationFrame()方法會返回一個requestID,是一個長整型非零值,作為一個唯一的標(biāo)識符,可將該值作為參數(shù)傳遞給window.cancelAnimationFrame()來取消這個函數(shù)。

cancelAnimationFrame(requestID);

兼容性代碼:

var cancelAnimFrame = function() {   

  return window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function(id) { clearTimeout(id); }; 

}();


三、SVG:可伸縮的矢量圖形

SVG是一種用于描述圖形的XML語法。由于結(jié)構(gòu)是XML格式,使得它可以插入HTML文檔,成為DOM的一部分,然后用JavaScript和CSS進(jìn)行操作。


一個簡單的SVG文件如下:

<svg xmlns="http://www.w3.org/2000/svg" vieBox="0 0 1000 1000" id="mySvg">

  <rect x="100" y="200" width="800" height="600" stroke="black" stroke-width="25" fill="red"/>

</svg>

要使用SVG有很多方法,最簡單的就是直接將SVG代碼嵌入到HTML中:

<body>

  <svg xmlns="http://www.w3.org/2000/svg" vieBox="0 0 1000 1000" id="mySvg">     <rect x="100" y="200" width="800" height="600" stroke="black" stroke-width="25" fill="red"/>   

  </svg>

</body>

SVG代碼也可以單獨(dú)寫在一個文件中,后綴是“.svg”,然后用在<img>、<object>、<embed>、<iframe>等標(biāo)簽,以及CSS的background-image屬性,將這個文件插入網(wǎng)頁。

<img src="example.svg">


<object data="example.svg" type="image/svg+xml"></object>


<embed src="example.svg" type="image/svg+xml">


<iframe src="example.svg"></iframe>

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號