Canvas教程(20)——裁剪和繪制圖像

裁剪區(qū)域clip()

使用Canvas繪制圖像的時候笼恰,我們經(jīng)常會想要只保留圖像的一部分统台,這是我們可以使用canvas API再帶的圖像裁剪功能來實現(xiàn)這一想法熊昌。
Canvas API的圖像裁剪功能是指础锐,在畫布內(nèi)使用路徑拘荡,只繪制該路徑內(nèi)所包含區(qū)域的圖像,不會只路徑外的圖像接剩。這有點像Flash中的圖層遮罩切厘。

使用圖形上下文的不帶參數(shù)的clip()方法來實現(xiàn)Canvas的圖像裁剪功能。該方法使用路徑來對Canvas話不設(shè)置一個裁剪區(qū)域懊缺。因此疫稿,必須先創(chuàng)建好路徑。創(chuàng)建完整后鹃两,調(diào)用clip()方法來設(shè)置裁剪區(qū)域遗座。
需要注意的是裁剪是對畫布進行的,裁切后的畫布不能恢復(fù)到原來的大小俊扳,也就是說畫布是越切越小的途蒋,要想保證最后仍然能在canvas最初定義的大小下繪圖需要注意save()restore()。畫布是先裁切完了再進行繪圖馋记。并不一定非要是圖片号坡,路徑也可以放進去~

先來看看一個簡單的Demo。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>裁剪區(qū)域</title>
    <style>
        body { background: url("./images/bg3.jpg") repeat; }
        #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }
    </style>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas">
        你的瀏覽器居然不支持Canvas梯醒?宽堆!趕快換一個吧!茸习!
    </canvas>
</div>

<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");
        context.fillStyle = "#FFF";
        context.fillRect(0,0,800,600);

        //在屏幕上繪制一個大方塊
        context.fillStyle = "black";
        context.fillRect(10,10,200,200);
        context.save();
        context.beginPath();

        //裁剪畫布從(0畜隶,0)點至(50,50)的正方形
        context.rect(0,0,50,50);
        context.clip();

        //紅色圓
        context.beginPath();
        context.strokeStyle = "red";
        context.lineWidth = 5;
        context.arc(100,100,100,0,Math.PI * 2,false);
        //整圓
        context.stroke();
        context.closePath();

        context.restore();

        //再次裁切整個畫布
        context.beginPath();
        context.rect(0,0,500,500);
        context.clip();

        //繪制一個沒有裁切的藍(lán)線
        context.beginPath();
        context.strokeStyle = "blue";
        context.lineWidth = 5;
        context.arc(100,100,50,0,Math.PI * 2,false);
        //整圓
        context.stroke();
        context.closePath();
    };
</script>
</body>
</html>

演示 20-1

運行結(jié)果:

裁剪區(qū)域

自己分析吧逮光,能夠理解這段程序代箭,就完全掌握了clip()方法的使用了。

繪制圖像drawImage()

drawImage()是一個很關(guān)鍵的方法涕刚,它可以引入圖像嗡综、畫布、視頻杜漠,并對其進行縮放或裁剪极景。

一共有三種表現(xiàn)形式:

  1. 三參數(shù):context.drawImage(img,x,y)
  2. 五參數(shù):context.drawImage(img,x,y,width,height)
  3. 九參數(shù):context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height)
    三參數(shù)的是標(biāo)準(zhǔn)形式,可用于加載圖像驾茴、畫布或視頻盼樟;五參數(shù)的除了可以加載圖像還可以對圖像進行指定寬高的縮放;九參數(shù)的除了縮放锈至,還可以裁剪晨缴。各參數(shù)意義見下表。
參數(shù) 描述
img 規(guī)定要使用的圖像峡捡、畫布或視頻击碗。
sx 可選筑悴。開始剪切的 x 坐標(biāo)位置。
sy 可選稍途。開始剪切的 y 坐標(biāo)位置阁吝。
swidth 可選。被剪切圖像的寬度械拍。
sheight 可選突勇。被剪切圖像的高度。
x 在畫布上放置圖像的 x 坐標(biāo)位置坷虑。
y 在畫布上放置圖像的 y 坐標(biāo)位置甲馋。
width 可選。要使用的圖像的寬度迄损。(伸展或縮小圖像)
height 可選摔刁。要使用的圖像的高度。(伸展或縮小圖像)

下面海蔽,我們加載一個圖片試試。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>drawImage()</title>
    <style>
        body { background: url("./images/bg3.jpg") repeat; }
        #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }
    </style>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas">
        你的瀏覽器居然不支持Canvas绑谣?党窜!趕快換一個吧!借宵!
    </canvas>
</div>

<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");
        context.fillStyle = "#FFF";
        context.fillRect(0,0,800,600);

        var img = new Image();
        img.src = "./images/20-1.jpg";
        img.onload = function(){
            context.drawImage(img,200,50);
        }
    };
</script>
</body>
</html>

演示 20-2

運行結(jié)果:

drawImage()

創(chuàng)建相框

這里幌衣,我們結(jié)合clip()drawImage()以及之前學(xué)的三次貝塞爾曲線bezierCurveTo(),來為上面一個案例壤玫,加上一個心形的相框~

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>繪制心形相框</title>
    <style>
        body { background: url("./images/bg3.jpg") repeat; }
        #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }
    </style>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas">
        你的瀏覽器居然不支持Canvas豁护?!趕快換一個吧S洹楚里!
    </canvas>
</div>

<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");
        context.fillStyle = "#FFF";
        context.fillRect(0,0,800,600);

        context.beginPath();
        context.moveTo(400,260);
        context.bezierCurveTo(450,220,450,300,400,315);
        context.bezierCurveTo(350,300,350,220,400,260);
        context.clip();
        context.closePath();

        var img = new Image();
        img.src = "./images/20-1.jpg";
        img.onload = function(){
            context.drawImage(img,348,240,100,100);
        }
    };
</script>
</body>
</html>

演示 20-3

運行結(jié)果截圖:

繪制心形相框

是不是美美的?好啦猎贴,至此最關(guān)鍵的遮罩和圖像裁剪以及說完了班缎,其實在java.awt中,drawImage()也是一個至關(guān)重要的方法她渴。有人說制作Java游戲界面达址,只要會用drawImage()就可以一招打遍天下~在Canvas里也是一樣的。美工提供的素材基本都是圖片趁耗,這個時候drawImage()對圖片的處理就很重要了沉唠。即使基本功,也是對圖片最重要的處理方法苛败。

這一節(jié)就跟大家吹這么多了~讓我們繼續(xù)前進满葛!??


如果您喜歡本書径簿,請使用支付寶掃描下面的二維碼捐助作者。

二維碼

謝謝您的支持纱扭!也歡迎您訂閱本書牍帚。

如果書中有疏漏或錯誤之處,敬請您指出乳蛾,期待您的pull request暗赶。如果有任何疑問也可以發(fā)送issue。

本人郵箱:airing@ursb.me

本人博客:http://ursb.me

本書地址:http://airingursb.gitbooks.io/canvas

本書github:http://github.com/airingursb/canvas

Canvas--Draw on the Web
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肃叶,一起剝皮案震驚了整個濱河市蹂随,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌因惭,老刑警劉巖岳锁,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蹦魔,居然都是意外死亡激率,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進店門勿决,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乒躺,“玉大人,你說我怎么就攤上這事低缩〖蚊埃” “怎么了?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵咆繁,是天一觀的道長讳推。 經(jīng)常有香客問我,道長玩般,這世上最難降的妖魔是什么银觅? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮坏为,結(jié)果婚禮上设拟,老公的妹妹穿的比我還像新娘。我一直安慰自己久脯,他們只是感情好纳胧,可當(dāng)我...
    茶點故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帘撰,像睡著了一般跑慕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天核行,我揣著相機與錄音牢硅,去河邊找鬼。 笑死芝雪,一個胖子當(dāng)著我的面吹牛减余,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惩系,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼位岔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了堡牡?” 一聲冷哼從身側(cè)響起抒抬,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晤柄,沒想到半個月后擦剑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡芥颈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年惠勒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爬坑。...
    茶點故事閱讀 40,435評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡捉撮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妇垢,到底是詐尸還是另有隱情,我是刑警寧澤肉康,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布闯估,位于F島的核電站,受9級特大地震影響吼和,放射性物質(zhì)發(fā)生泄漏涨薪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一炫乓、第九天 我趴在偏房一處隱蔽的房頂上張望刚夺。 院中可真熱鬧,春花似錦末捣、人聲如沸侠姑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莽红。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間安吁,已是汗流浹背醉蚁。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鬼店,地道東北人网棍。 一個月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像妇智,于是被迫代替她去往敵國和親滥玷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,442評論 2 359

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

  • 一:canvas簡介 1.1什么是canvas俘陷? ①:canvas是HTML5提供的一種新標(biāo)簽 ②:HTML5 ...
    GreenHand1閱讀 4,691評論 2 32
  • 本文首發(fā)于我的個人博客:http://cherryblog.site/github項目地址:https://git...
    sunshine小小倩閱讀 1,991評論 1 8
  • 一罗捎、canvas簡介 1.1 什么是canvas?(了解) 是HTML5提供的一種新標(biāo)簽 Canvas是一個矩形區(qū)...
    Looog閱讀 3,942評論 3 40
  • 一拉盾、canvas簡介 1.1 什么是canvas桨菜?(了解) 是HTML5提供的一種新標(biāo)簽 Canvas是一個矩形區(qū)...
    J_L_L閱讀 1,520評論 0 4
  • 一、圖形的組合方式 globalAlpha是一個介于0和1之間的值(包括0和1)捉偏,用于指定所有繪制的透明度倒得。默認(rèn)值...
    空谷悠閱讀 1,278評論 0 0