《小白H5成長之路47》將外部圖片繪制到canvas上

“小白,canvas繪制圖形功能自己看了么袜漩?”

“看了绪爸,我自己畫了些圓和線條,還繪制了問題宙攻,不過感覺沒什么實用價值奠货。”

“這些功能對于做圖表還是很有用的粘优,了解一下就可以了仇味,我們今天聊聊canvas在web前端應(yīng)用中最常用的一個功能——重繪外部圖片”⑺常”

“外部圖片直接插入到網(wǎng)頁上不行么丹墨?為什么要在canvas中重繪呢?”

老朱說:“假如用戶上傳頭像的時候圖片格式特別大嬉愧,我們就可以把頭像先在canvas中重繪一下贩挣,然后再把重繪好的圖片發(fā)送到服務(wù)器進行保存,這樣用戶以后使用頭像的時候,圖片格式就非常小了王财。從今天開始我們實現(xiàn)一下圖片上傳的功能卵迂,你先創(chuàng)建一個空的html文件,然后插入一個canvas標(biāo)簽绒净〖洌”

小白很快便布局好了,說道:“好了挂疆,我還用css控制了canvas的寬度和高度改览!”

老朱看完以后說道:“在javascript中有一個Image類,他是用來對圖片進行操作的類缤言,我們可以通過實例化一個Image對象來做一些圖片的操作宝当,比如:”

“這段代碼實例化了一個img圖片對象,通過img的路徑(src)屬性可是設(shè)置圖片的路徑胆萧。在canvas中繪制圖片用到的是drawImage(img,sx,sy,swidth,sheight,x,y,width,height)方法庆揩,這里第一個參數(shù)就是圖片對象,sx和sy是裁剪的位置跌穗,swidth和sheight是要使用的圖片對象的寬度和高度订晌,x和y是圖片在canvas中的坐標(biāo)位置,width和height是最終顯示的圖片的寬和高瞻离。它還有一個重載方法是drawImage(img,x,y)腾仅,這個方法只考慮圖片對象和x軸y軸√桌”

小白有點不明白推励,說道:“感覺有點暈啊肉迫!”

老朱:“沒關(guān)系验辞,我們通過一個實例看看怎么繪制圖片『吧溃”

“我現(xiàn)在使用了三個參數(shù)進行繪制跌造,第一個參數(shù)是img對象,第二個參數(shù)是圖片距離canvas左端的距離族购,第三個參數(shù)是圖片距離頂端的距離壳贪。如果希望圖片從左上角開始重繪,我們可以把后兩個參數(shù)都設(shè)置為0寝杖∥ナ”

小白說:“怎樣才能讓圖片跟canvas高度和寬度一致呢?”

老朱:“這里我們就需要使用drawImage(img,sx,sy,swidth,sheight,x,y,width,height)方法了瑟幕,可以看出sx磕蒲、sy留潦、x、y都應(yīng)該取0值辣往。width和height應(yīng)該跟canvas寬度高度一致兔院。關(guān)鍵是swidth和sheight的值≌鞠鳎”

小白:“按照字面意思理解坊萝,這里是要使用的圖片的高度和寬度,那應(yīng)該是取圖片的原始寬度和高度吧钻哩!”

老朱:“恩屹堰,是的,要拿到它的原始高度和寬度街氢,可以通過Image對象的width和height屬性獲取,不過直接取會有問題睦袖,你可以先看一下直接取的問題珊肃。”

小白:“為什么取不上呢馅笙?”

老朱:“當(dāng)img的src屬性指向?qū)?yīng)地址以后伦乔,瀏覽器無法瞬間拿到圖片的寬度和高度,我們需要等圖片加載完成以后才能獲榷啊(除非圖片加載過并且在緩存中才能取到)烈和,所以保險起見我們需要使用當(dāng)圖片加載完成(onload)的方法∶罅埽”

“這樣無論是不是首次加載圖片招刹,都可以拿到圖片原始寬度和高度了,最后我們在onload方法中重繪圖片就可以了窝趣》枋睿”

小白:“感覺還是不對啊,圖片比例有問題哑舒!”

老朱:“這正是我們要說的圖片重繪很重要的一個問題妇拯,通過css控制canvas寬度和高度之后,canvas只是按比例進行了變化洗鸵,也就是說canvas其實是變形的≡叫猓現(xiàn)在把canvas的css寬度和高度去掉看一下效果”毂酰”

“他的默認(rèn)寬度和高度是300×150像素甘凭,所以我們對canvas進行寬度高度控制的時候最好在canvas屬性上直接設(shè)定寬度和高度±艋觯”

“這樣就沒有問題了对蒲!在實際使用的時候位圖重繪可能有很多需求钩蚊,你需要根據(jù)需求設(shè)定對應(yīng)的繪制參數(shù),我希望你能把drawImage參數(shù)做不同變化進行測試蹈矮。主要做下面三個功能的練習(xí)”

1砰逻、圖片裁剪;

2泛鸟、繪制到canvas指定位置蝠咆,如右下角;

3北滥、如何通過jQuery動態(tài)更改canvas寬度和高度(通過attr更改canvas屬性)后刚操,還能正確重繪圖片。


想學(xué)H5的朋友可以關(guān)注老爐再芋,您的關(guān)注是我持續(xù)更新《小白HTML5成長之路》的動力菊霜!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市济赎,隨后出現(xiàn)的幾起案子鉴逞,更是在濱河造成了極大的恐慌,老刑警劉巖司训,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件构捡,死亡現(xiàn)場離奇詭異,居然都是意外死亡壳猜,警方通過查閱死者的電腦和手機勾徽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來统扳,“玉大人喘帚,你說我怎么就攤上這事∩劣模” “怎么了啥辨?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盯腌。 經(jīng)常有香客問我溉知,道長,這世上最難降的妖魔是什么腕够? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任级乍,我火速辦了婚禮,結(jié)果婚禮上帚湘,老公的妹妹穿的比我還像新娘玫荣。我一直安慰自己,他們只是感情好大诸,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布捅厂。 她就那樣靜靜地躺著贯卦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪焙贷。 梳的紋絲不亂的頭發(fā)上撵割,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音辙芍,去河邊找鬼啡彬。 笑死,一個胖子當(dāng)著我的面吹牛故硅,可吹牛的內(nèi)容都是我干的庶灿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吃衅,長吁一口氣:“原來是場噩夢啊……” “哼往踢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捐晶,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤菲语,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后惑灵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡眼耀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年英支,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哮伟。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡干花,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出楞黄,到底是詐尸還是另有隱情池凄,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布鬼廓,位于F島的核電站肿仑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碎税。R本人自食惡果不足惜尤慰,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雷蹂。 院中可真熱鬧伟端,春花似錦、人聲如沸匪煌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至霜医,卻和暖如春齿拂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背支子。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工创肥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人值朋。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓叹侄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親昨登。 傳聞我的和親對象是個殘疾皇子趾代,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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