canvas學(xué)習(xí)二

一奕枢、繪制文字

【1】font字體屬性

canvas 里的font 屬性和css 的font 屬性是一樣的娄昆,它可以設(shè)置文本的粗細(xì)、字號(hào)验辞、字體等

  • css 設(shè)置字體:p{ font: bold 15px 微軟雅黑; }
  • canvas 設(shè)置字體:ctx.font = 'bold 15px 微軟雅黑'

【2】textAlign水平對(duì)齊

textAlign 設(shè)置或返回文本內(nèi)容的當(dāng)前對(duì)齊方式

  • start: 默認(rèn), 文本在指定的位置開(kāi)始
  • end: 文本在指定的位置結(jié)束
  • center: 文本的中心被放置在指定的位置
  • left: 文本左對(duì)齊
  • right: 文本右對(duì)齊

【3】textBaseline垂直對(duì)齊

textBaseline 設(shè)置或返回在繪制文本時(shí)使用的當(dāng)前文本基線

  • alphabetic:默認(rèn)稿黄,文本基線是普通的字母基線
  • top:文本基線是 em 方框的頂端
  • hanging:文本基線是懸掛基線
  • middle:文本基線是 em 方框的正中
  • ideographic: 文本基線是 em 基線
  • bottom:文本基線是 em 方框的底端

【4】文本繪制方法

填充文字: fillText(text, x, y, maxWidth)

描邊文字: strokeText(text, x, y, maxWidth)

解釋:

text:填充的文字

x y:坐標(biāo)

maxWidth:文字最大寬度喊衫,該值小于文字寬度會(huì)自動(dòng)縮小填充文字

【5】獲取文字寬度方法

獲取文字寬度:ctx.measureText(text)

【6】案例

<body>
  <canvas id="canvas"></canvas>
  <script>
    // 創(chuàng)建canvas
    const canvas = document.getElementById('canvas');
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    const ctx = canvas.getContext('2d');

    // 文字屬性
    ctx.font = 'bold 200px Arial';

    // 投影
    ctx.shadowColor = 'rgba(0,0,0,0.6)';
    ctx.shadowOffsetY = 2;
    ctx.shadowBlur = 4;

    // 實(shí)體文字
    ctx.fillStyle = '#b76251';
    ctx.fillText('canvas', 50, 150);

    // 實(shí)體描邊文字
    ctx.strokeStyle = '#f0d5bc';
    ctx.lineWidth = 9;
    ctx.strokeText('canvas', 50, 150);

    // 虛線描邊
    ctx.strokeStyle = '#000';
    ctx.lineWidth = 1;
    ctx.setLineDash([5, 3]);
    ctx.strokeText('canvas', 50, 150);
  </script>
</body>

二跌造、繪制圖片

【1】繪制圖像的基本方式(繪圖+位移)

語(yǔ)法:ctx.drawImage(img, x族购,y)

參數(shù)說(shuō)明:

img:是繪制圖片的dom對(duì)象

x y :圖片向右和向下位移坐標(biāo)

【2】繪圖+位移+寬高

語(yǔ)法:ctx.drawImage(img壳贪,x,y寝杖,width违施,height)

參數(shù)說(shuō)明:

img:是繪制圖片的dom對(duì)象

x y :圖片向右和向下位移坐標(biāo)

width:繪制圖片的寬度

height:繪制圖片的高度

【3】繪圖+位移+寬高+裁剪

語(yǔ)法:ctx.drawImage(img,sx瑟幕,sy磕蒲,swidth,sheight只盹,x辣往,y,width殖卑,height)

參數(shù)說(shuō)明:

img:是繪制圖片的dom對(duì)象

sx sy: 裁剪的左上角坐標(biāo)

swidth:裁剪圖片的高度

sheight:裁剪的高度

x y :圖片向右和向下位移坐標(biāo)

width:繪制圖片的寬度

height:繪制圖片的高度

【4】JavaScript建立圖像源的方式

// 第一種
var img = document.getElementById('imgId');

// 第二種
let img = new Image(); //這個(gè)就是img標(biāo)簽的dom對(duì)象
img.src = '/images/test.gif';
img.alt = '文本信息';
img.onload = function() {
  //圖片加載完成后站削,執(zhí)行此方法
};

【5】案例

<body>
  <canvas id="canvas"></canvas>
  <script>
    // 創(chuàng)建畫(huà)布
    const canvas = document.getElementById('canvas');
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    const ctx = canvas.getContext('2d');

    // 創(chuàng)建圖像源
    const img = new Image();
    img.src = './images/person.png';
    img.onload = function () {
      const { width, height } = img;

      // 繪圖+移動(dòng) drawImage(img, x, y)
      // ctx.drawImage(img, 0, 0);

      // 繪圖+移動(dòng)+寬高 drawImage(img, x, y, width, height)
      ctx.drawImage(img, 0, 0, width / 5, height / 5); //偏移到x軸為0 y軸為0的位置展示, 圖片寬高=原圖寬高/5

      // 繪圖+裁剪+移動(dòng)+寬高 drawImage(img, sx, sy, swidth, sheight, x, y, width, height)
      ctx.drawImage(
        img,
        0, 0, width / 2, height / 2,  // 從左邊 0,0 開(kāi)始裁剪孵稽, 裁剪原圖寬度的一半许起,高度的一半
        200, 0, width / 5, height / 5 // 偏移到x軸200y軸0的位置展示, 圖片寬高=原圖寬高/5
      );
    };
  </script>
</body>

三菩鲜、像素操作

【1】imageData是什么园细?

ImageData 是圖片的數(shù)據(jù)化,是一個(gè)對(duì)象接校,它具備以下幾個(gè)屬性:

data:Uint8ClampedArray[r, g, b, a, r, g, b, a, r, g, b, a, r, g, b, a]

width:整數(shù)猛频,ImageData的寬度

heidth:整數(shù),ImageData的高度

Uint8ClampedArray 翻譯過(guò)來(lái)是 8位無(wú)符號(hào)整型固定數(shù)組馅笙,每四個(gè)數(shù)組元素代表了一個(gè)像素點(diǎn)的rgba信息伦乔,每個(gè)元素?cái)?shù)值取值范圍是[0,255]董习。若小于0烈和,則為0,大于255皿淋,則為255招刹。若為小數(shù)恬试,則取整,取整的方法是銀行家舍入疯暑。

【2】獲取imageData對(duì)象

方法:ctx.getImageData(x, y, width, height)

作用: 用來(lái)獲取canvas畫(huà)布上指定矩形區(qū)域的像素?cái)?shù)據(jù)

解釋:

xy: 矩形的左頂點(diǎn)橫縱坐標(biāo)

width: 矩形的寬度

height: 矩形的高度

【3】imageData可以做什么训柴?

我可以通過(guò)不同的算法,對(duì)ImageData 中的像素進(jìn)行不同的處理妇拯。比如調(diào)整圖片的色調(diào)幻馁,檢測(cè)圖像邊緣,實(shí)現(xiàn)藝術(shù)效果越锈,馬賽克仗嗦,人臉識(shí)別……

【4】案例

遍歷圖片像素,通過(guò)灰度算法對(duì)圖片像素做處理使圖片變成灰色調(diào)

<body>
  <canvas id="canvas"></canvas>
  <script>
    // 創(chuàng)建畫(huà)布
    const canvas = document.getElementById('canvas');
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    const ctx = canvas.getContext('2d');

    // js創(chuàng)建圖片源
    const img = new Image();
    img.src = 'https://img-blog.csdnimg.cn/20210407160120758.png'
    img.setAttribute('crossOrigin', '');
    img.onload = draw;

    function draw() {
      // 圖像尺寸
      const { width, height } = img;

      // 在canvas 中繪制圖像
      ctx.drawImage(img, 10, 10, 150, 200);

      // 從canvas 中獲取圖像的ImageData
      const imgData = ctx.getImageData(0, 0, width, height);
      const data = imgData.data;

      // 像素遍歷
      for (let i = 0; i < data.length; i += 4) {
        const [r, g, b] = [
          data[i],
          data[i + 1],
          data[i + 2],
        ]

        // 將圖片變灰甘凭,灰度算法公式: 0.299*r+0.587*g+0.114*b 
        const lm = 0.299 * r + 0.587 * g + 0.114 * b;
        data[i] = lm;
        data[i + 1] = lm;
        data[i + 2] = lm;
      }

      // 在canvas 中顯示ImageData
      ctx.putImageData(imgData, 0, 0);
    }

  </script>
</body>

四稀拐、變換

【1】縮放scale()

作用:scale()方法縮放當(dāng)前繪圖,更大或更小

語(yǔ)法:ctx.scale(scalewidth丹弱,scaleheight)

scalewidth : 縮放當(dāng)前繪圖的寬度 (1=100%德撬, 0.5=50%,2=200%躲胳,依次類推)

scaleheight : 縮放當(dāng)前繪圖的高度 (1=100%蜓洪,0.5=50%,2=200%泛鸟,依次類推)

注意:縮放的是整個(gè)畫(huà)布蝠咆,縮放后,繼續(xù)繪制的圖形會(huì)被放大或縮小

【2】位移translate()

語(yǔ)法:ctx.translate(x, y)

x: 添加到水平坐標(biāo)(x)上的值

y: 添加到垂直坐標(biāo)(y)上的值

注意:發(fā)生位移后北滥,相當(dāng)于把畫(huà)布的 0,0 坐標(biāo) 更換到新的 x,y 的位置刚操,所有繪制的新元素都被影響。位移畫(huà)布一般配合縮放和旋轉(zhuǎn)等再芋。

【3】旋轉(zhuǎn)rotate()

作用:方法旋轉(zhuǎn)當(dāng)前的繪圖

語(yǔ)法:context.rotate(angle)

angle:弧度(PI)

注意:參數(shù)是弧度(PI)菊霜,如需將角度轉(zhuǎn)換為弧度,請(qǐng)使用 degrees*Math.PI/180 公式進(jìn)行計(jì)算

【4】繪制環(huán)境保存和還原

ctx.save() 保存當(dāng)前環(huán)境的狀態(tài)济赎,可以把當(dāng)前繪制環(huán)境進(jìn)行保存到緩存中

ctx.restore() 恢復(fù)之前保存過(guò)的路徑狀態(tài)和屬性鉴逞,獲取最近緩存的 ctx,一般配合位移畫(huà)布使用

一般在我們繪制具備同一種樣式的圖形時(shí)司训,都會(huì)用save() restore() 將其包裹起來(lái)构捡。這是為了避免當(dāng)前的圖形樣式影響以后的圖形樣式。

【5】案例

<body>
  <canvas id="canvas"></canvas>
  <script>
    // 創(chuàng)建畫(huà)布
    const canvas = document.getElementById('canvas');
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    const ctx = canvas.getContext('2d');

    // 縮放: scale(x,y)
    ctx.save()
    ctx.scale(2, 2); // 放大到200%
    ctx.fillRect(0, 0, 100, 100);
    ctx.restore()

    // 移動(dòng): translate(x,y)
    ctx.save()
    ctx.translate(250, 0); // 移動(dòng)到x軸為250和y軸都為0的位置
    ctx.fillRect(0, 0, 100, 100);
    ctx.restore()

    // 旋轉(zhuǎn): rotate(angle)
    ctx.save()
    ctx.rotate(Math.PI / 4);
    ctx.fillRect(300, 0, 100, 100);
    ctx.restore()
  </script>
</body>

文章每周持續(xù)更新壳猜,可以微信搜索「 前端大集錦 」第一時(shí)間閱讀勾徽,回復(fù)【視頻】【書(shū)籍】領(lǐng)取200G視頻資料和30本PDF書(shū)籍資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市统扳,隨后出現(xiàn)的幾起案子喘帚,更是在濱河造成了極大的恐慌畅姊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吹由,死亡現(xiàn)場(chǎng)離奇詭異若未,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)倾鲫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)粗合,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人级乍,你說(shuō)我怎么就攤上這事舌劳。” “怎么了玫荣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)大诸。 經(jīng)常有香客問(wèn)我捅厂,道長(zhǎng),這世上最難降的妖魔是什么资柔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任焙贷,我火速辦了婚禮,結(jié)果婚禮上贿堰,老公的妹妹穿的比我還像新娘辙芍。我一直安慰自己,他們只是感情好羹与,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布故硅。 她就那樣靜靜地躺著,像睡著了一般纵搁。 火紅的嫁衣襯著肌膚如雪吃衅。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天腾誉,我揣著相機(jī)與錄音徘层,去河邊找鬼。 笑死利职,一個(gè)胖子當(dāng)著我的面吹牛趣效,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播猪贪,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼跷敬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了哮伟?” 一聲冷哼從身側(cè)響起干花,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤妄帘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后池凄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體抡驼,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年肿仑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了致盟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尤慰,死狀恐怖馏锡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伟端,我是刑警寧澤杯道,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站责蝠,受9級(jí)特大地震影響党巾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霜医,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一齿拂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肴敛,春花似錦署海、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至昨登,卻和暖如春趾代,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丰辣。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工撒强, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人笙什。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓飘哨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親琐凭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芽隆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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

  • 一、canvas簡(jiǎn)介 1.1 什么是canvas?(了解) 是HTML5提供的一種新標(biāo)簽 Canvas是一個(gè)矩形區(qū)...
    Looog閱讀 3,940評(píng)論 3 40
  • Canvas簡(jiǎn)介 canvas作用: canvas元素可以讓用戶在網(wǎng)頁(yè)上繪制圖形胚吁; canvas介紹 HTML5中...
    magic_pill閱讀 540評(píng)論 0 2
  • 前言 微信小游戲推出后一度爆火牙躺,一個(gè)簡(jiǎn)單的跳一跳讓大家玩的不亦樂(lè)乎,那么很多人就在想自己嘗試學(xué)學(xué)微信小游戲腕扶,開(kāi)發(fā)一...
    大公爵閱讀 2,770評(píng)論 0 11
  • 線條樣式 繪制直線孽拷,第五章知識(shí)簡(jiǎn)單回顧 lineWidth 設(shè)置或返回當(dāng)前的線條寬度,單位為像素 lineCap ...
    Zd_silent閱讀 472評(píng)論 0 0
  • 前言 html5Canvas的知識(shí)點(diǎn)半抱,是開(kāi)發(fā)的必備技能脓恕,在實(shí)際工作中也常常會(huì)涉及到。 最近熬夜總結(jié)html5Can...
    Afine_4d71閱讀 612評(píng)論 0 0