實(shí)現(xiàn)微信對(duì)話框的圖片樣式以及圖片邊框

| ? ?微信會(huì)話框

細(xì)心的前端們會(huì)發(fā)現(xiàn)如果你在微信里發(fā)一張和你當(dāng)前背景一樣的圖片讼育,那么微信的會(huì)給這張圖片加邊框苍碟,并且牺蹄,右邊的小三角是根據(jù)圖片的位置截取的忘伞。很多前端會(huì)用backgroud或者clip-path來畫,這樣畫出來的沒法設(shè)置小邊框。 所以需要我們“萬能”的canvas氓奈!canvas翘魄!canvas!

示例圖1

| ? ?JS全部代碼

我們分為兩步:首先摳出圓角和會(huì)話角的邊框舀奶,第二步根據(jù)需求壓縮處理你的圖片大小

需要的知識(shí)點(diǎn):1:canvas畫路徑摳圖暑竟;2:用圖片填充你的摳出來的部分

最后效果是:在原圖上摳出了你要的路徑并且!還帶邊框哦育勺!

總體流程:本機(jī)選擇一張圖 在頁面上顯示為我們想要的效果:

HTML:粘貼不過來很心塞但荤。。涧至。就截圖吧


JS:

你先去試一試腹躁,然后來看講解,畢竟要是用不了南蓬,豈不是很心塞纺非。

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

var reader = new FileReader(),

img = new Image();

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

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

reader.onload = function(e) {// 文件base64,可以看看結(jié)果

img.src = e.target.result;

};

inputele.addEventListener('change', function (e) {

var file = e.target.files[0];

if(file.size>=10000000){

window.alert("圖片太大,請(qǐng)重新選擇");

return;

}

if(file.size<=0){

window.alert("圖片為0kb赘方,請(qǐng)重新選擇")

return;

}

reader.readAsDataURL(file);

});

if(canvas.getContext){

//獲取對(duì)應(yīng)的CanvasRenderingContext2D對(duì)象(畫筆)

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

var w1 = '';

var h1 = '';

CanvasRenderingContext2D.prototype.roundRect = function (x, y, w, h, r) {

if (w < 2 * r) r = w / 2;

if (h < 2 * r) r = h / 2;

this.beginPath();

this.moveTo(x+r, y);

this.arcTo(x+w, y, x+w, y+h, r);

ctx.lineTo(w, 13);

ctx.lineTo(w1, 19);

ctx.lineTo(w, 25);

this.arcTo(x+w, y+h, x,? y+h, r);

this.arcTo(x, y+h, x, y, r);

this.arcTo(x, y, x+w, y, r);

this.closePath();

this.clip();

ctx.drawImage(img, 0, 0,w1,h1);

ctx.restore();

return this;

}

// base64地址圖片加載完畢后

img.onerror = function () {

alert("文件不是一個(gè)正確的圖片")

return;

}

img.onload = function () {

var w = this.width, h = this.height;

var width = w, height = h;

var size = 400;

//生成一個(gè)畫布烧颖,對(duì)畫布的大小根據(jù)圖片的大小計(jì)算

if (w >= h && w > size) { //寬 > 高

width = size;

height = size / w * h;

} else if (w < h && h > size) {

height = size;

width = size / h * w;

}

//計(jì)算的畫布的大小

w1 = width;? h1 = height;

ctx.canvas.width = w1;? ctx.canvas.height= h1;

ctx.lineWidth = 1;

ctx.strokeStyle = '#F00';//用紅色比較明顯啦

ctx.roundRect(0,0,width-5,height-1,6).stroke();

//畫完之后的畫布就是壓縮完之后的圖片 canvas ;

//縮略圖canvas轉(zhuǎn)為二進(jìn)制的數(shù)據(jù)用于上傳

canvas.toBlob(function (blob) {

//這里填你的ajax上傳步驟

});

};

};


| ? ?以下是效果圖兩張


效果圖1
效果圖2

| ? ?步驟詳解

先來說畫這個(gè)框框:來張優(yōu)秀的步驟圖對(duì)應(yīng)每一步的代碼:


優(yōu)秀的步驟圖

this.beginPath();

第一步畫上和上右圓角的線? :this.moveTo(x+r, y);this.arcTo(x+w, y, x+w, y+h, r);

第二步畫右邊的小三角:ctx.lineTo(w, 13);ctx.lineTo(w1, 19);ctx.lineTo(w, 25);

第三步畫右以及右下圓角的線:this.arcTo(x+w, y+h, x,? y+h, r);

第三步畫下以及左下圓角的線:this.arcTo(x, y+h, x, y, r);

第三步畫左以及左上圓角的線:this.arcTo(x, y, x+w, y, r);

畫完了:this.closePath();

摳圖U浮:this.clip();


然后就摳出了自己想要的圖形炕淮,然后用你的圖片填充就ok啦。

填充之前按照我們最愛的UI給的尺寸等比例放大縮小

if (w >= h && w > size) { //寬 > 高

width = size;

height = size / w * h;

} else if (w < h && h > size) {

height = size;

width = size / h * w;

}

填充就用我們的canvas的API? drawImage?

ctx.drawImage(img, 0, 0,w1,h1);不論你的原圖是多少像素跳夭,都會(huì)實(shí)現(xiàn)按照w1鳖悠,h1的大小重繪,所以你右鍵下載一下對(duì)比之前原圖的大小就會(huì)發(fā)現(xiàn)S琶睢乘综!壓縮了圖片!L着稹卡辰!所以順便學(xué)習(xí)了壓縮圖片,很棒棒吧~~~

優(yōu)秀的對(duì)比圖

有用的話留言告訴大家~~~

ok啦~~~有什么問題留言解決

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末邪意,一起剝皮案震驚了整個(gè)濱河市九妈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雾鬼,老刑警劉巖萌朱,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異策菜,居然都是意外死亡晶疼,警方通過查閱死者的電腦和手機(jī)酒贬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門镀娶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搓侄,“玉大人,你說我怎么就攤上這事傲醉『祝” “怎么了零如?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)锄弱。 經(jīng)常有香客問我考蕾,道長(zhǎng),這世上最難降的妖魔是什么会宪? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任辕翰,我火速辦了婚禮,結(jié)果婚禮上狈谊,老公的妹妹穿的比我還像新娘喜命。我一直安慰自己,他們只是感情好河劝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布壁榕。 她就那樣靜靜地躺著,像睡著了一般赎瞎。 火紅的嫁衣襯著肌膚如雪牌里。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天务甥,我揣著相機(jī)與錄音牡辽,去河邊找鬼。 笑死敞临,一個(gè)胖子當(dāng)著我的面吹牛态辛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挺尿,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼奏黑,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了编矾?” 一聲冷哼從身側(cè)響起熟史,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窄俏,沒想到半個(gè)月后蹂匹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凹蜈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年限寞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忍啸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昆烁,死狀恐怖吊骤,靈堂內(nèi)的尸體忽然破棺而出缎岗,到底是詐尸還是另有隱情静尼,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布传泊,位于F島的核電站鼠渺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏眷细。R本人自食惡果不足惜拦盹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望溪椎。 院中可真熱鬧普舆,春花似錦、人聲如沸校读。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽歉秫。三九已至蛾洛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雁芙,已是汗流浹背轧膘。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兔甘,地道東北人谎碍。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像洞焙,于是被迫代替她去往敵國(guó)和親椿浓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • 一:canvas簡(jiǎn)介 1.1什么是canvas闽晦? ①:canvas是HTML5提供的一種新標(biāo)簽 ②:HTML5 ...
    GreenHand1閱讀 4,681評(píng)論 2 32
  • 一扳碍、canvas簡(jiǎn)介 1.1 什么是canvas?(了解) 是HTML5提供的一種新標(biāo)簽 Canvas是一個(gè)矩形區(qū)...
    Looog閱讀 3,942評(píng)論 3 40
  • 一仙蛉、canvas簡(jiǎn)介 1.1 什么是canvas笋敞?(了解) 是HTML5提供的一種新標(biāo)簽 Canvas是一個(gè)矩形區(qū)...
    J_L_L閱讀 1,516評(píng)論 0 4
  • 個(gè)人飲食癖 這個(gè)系列能做出來么? 我不是中華美食愛好者荠瘪;喜歡大塊大塊吃夯巷;經(jīng)常專注食材本身味道和甜味赛惩。 山東濰坊人,...
    jieroarchl閱讀 198評(píng)論 0 1
  • After 17/陳綺貞 一步一步走過昨天我的孩子氣 我的孩子起給我勇氣/孩子氣保護(hù)我的身體 每天每天電視里販賣新...
    流明拾光閱讀 630評(píng)論 0 0