成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

JavaScript基于用戶照片姓名生成海報(bào)

瀏覽:172日期:2023-10-24 17:00:13

前言

最近在為公司的一個(gè)比賽制作專題頁,碰到一個(gè)使用參賽者上傳的照片生成專屬海報(bào)的需求,實(shí)現(xiàn)過程中用到了一些以前沒用過的 api,也踩了一些坑,于是將其記錄下來。

需求描述

用戶點(diǎn)擊按鈕進(jìn)行照片上傳 照片上傳完成后,將照片進(jìn)行裁剪,并和海報(bào)背景、姓名等組合得到海報(bào) 將生成的海報(bào)上傳

效果大概如下:

海報(bào)背景:

JavaScript基于用戶照片姓名生成海報(bào)

成品:

JavaScript基于用戶照片姓名生成海報(bào)

實(shí)現(xiàn)過程

1、初始化 canvas

canvas#poster-canvas(width=’960’ height=’1280’)function initCanvas() {canvasCtx = document.getElementById('poster-canvas').getContext(’2d’);}

2、繪制海報(bào)背景

海報(bào)背景為預(yù)先提供的一張照片,將其設(shè)置到一個(gè)隱藏的 img 標(biāo)簽里面,并且預(yù)留一個(gè) canvas 元素用于繪制海報(bào):

img.poster-background(src=’/assets/xxx/poster-background.jpeg’)

頁面加載完成后,將海報(bào)背景繪制到 canvas 內(nèi):

$(’img.poster-background’).on(’load’, function () { var backgroundImg = $(’img.poster-background’)[0]; canvasCtx.drawImage(backgroundImg, 0, 0, 960, 1280); renderName();});

海報(bào)背景繪制完成之后,需要將用戶姓名繪制到特定位置。由于用戶姓名長(zhǎng)度不一,因此需要進(jìn)行計(jì)算確定字體大小:

function renderName() { var name = $(’input[name='chName']’).val(); var fontSize; if (name.length < 3) { fontSize = 100; } else { fontSize = parseInt(320 / name.length); } canvasCtx.font = 'bold ' + fontSize + 'px Courier New'; canvasCtx.fillStyle = '#de071b'; canvasCtx.fillText(name, 20, 1066);}

3、上傳照片

使用 file 類型的 input 元素,因?yàn)轫撁嫔媳憩F(xiàn)為點(diǎn)擊按鈕,因此使用經(jīng)典的將 input 元素透明化并覆蓋按鈕的方法:

a.upload-btn input#photo(type=’file’ name=’photo’ accept=’image/jpeg, image/png’) | 上傳自己的照片生成專屬海報(bào).upload-btn input { position: absolute; left: 0; top: 0; opacity: 0; width: 100%; height: 68px; cursor: pointer;}

然后監(jiān)聽 input 元素的 change 事件,然后使用 FormData API 構(gòu)造表單數(shù)據(jù),使用 ajax 進(jìn)行異步上傳,照片上傳完成之后。得到一個(gè)地址,將這個(gè)地址設(shè)置到頁面上預(yù)留的一個(gè) img 標(biāo)簽里面:

$(’#photo’).on(’change’, function (e) { var file = e.target.files[0]; var type = file.type; if (type !== ’image/jpeg’ && type !== ’image/png’) { window.toastr.error(’請(qǐng)上傳 jpg 或 png 格式的圖片’); } else { var formData = new FormData(); formData.append(’avatar’, file); $.ajax({ type: ’POST’, url: ’/upload_url’, data: formData, contentType: false, processData: false, success: function(result) { var avatarUrl = result.data.url; $(’img.avatar’).attr(’src’, avatarUrl); }, error: function(err) { } }); }});

4、繪制照片

海報(bào)中放置照片的區(qū)域?yàn)檎叫危怯脩羯蟼鞯恼掌瑓s不一定,因此需要對(duì)照片進(jìn)行裁剪,裁剪的原則為取照片中間部分。然后將裁剪參數(shù)傳進(jìn) canvas 的 drawImage 方法,進(jìn)行繪制:

$(’img.avatar’).on(’load’, function () { var avatarImg = $(’img.avatar’)[0]; var originWidth = avatarImg.width; var originHeight = avatarImg.height; var newWidth, cutStartX, cutStartY; if (originWidth < originHeight) { newWidth = originWidth; cutStartX = 0; cutStartY = (originHeight - originWidth) / 2; } else if (originWidth > originHeight) { newWidth = originHeight; cutStartX = (originWidth - originHeight) / 2; cutStartY = 0; } else { newWidth = originWidth; cutStartX = 0; cutStartY = 0; } canvasCtx.drawImage(avatarImg, cutStartX, cutStartY, newWidth, newWidth, 0, 0, 960, 960); uploadPoster(); });

前面繪制海報(bào)背景和這里繪制照片,調(diào)用的是同一個(gè)方法,只不過后者多傳進(jìn)去了裁剪參數(shù)。但是需要注意的是,裁剪參數(shù)是在繪制位置之前傳進(jìn)去的,而不是簡(jiǎn)單的補(bǔ)在后面:

canvasCtx.drawImage(backgroundImg, 0, 0, 960, 1280);

canvasCtx.drawImage(avatarImg, cutStartX, cutStartY, newWidth, newWidth, 0, 0, 960, 960);

5、上傳海報(bào)

依然使用 FormData API,因此需要先用 canvas 構(gòu)造一個(gè) Blob 對(duì)象。新版本的 Chrome 和 Firefox 支持 canvas 的 toBlob 方法,可以直接使用:

document.getElementById('poster-canvas').toBlob(function (blob) {});

其它瀏覽器里,可以先用 toDataURL方法得到 base64 格式的圖片數(shù)據(jù),再轉(zhuǎn)為 Blob:

var blob = dataURLtoBlob(document.getElementById('poster-canvas').toDataURL());function dataURLtoBlob(dataurl) { if (dataurl.indexOf(’base64’) < 0) { dataurl = ’data:image/jpeg;base64,’ + dataurl; } var arr = dataurl.split(’,’); var mime = arr[0].match(/:(.*?);/)[1]; var bstr = atob(arr[1]); var n = bstr.length; var u8arr = new Uint8Array(n); while (n --) { u8arr[n] = bstr.charCodeAt(n); } return new Blob([u8arr], {type: mime});}

然后進(jìn)行上傳,步驟和前面上傳照片一致:

var formData = new FormData();formData.append(’poster’, blob);$.ajax({ type: ’POST’, url: ’/upload_poster_url’, data: formdata, contentType: false, processData: false, success: function(result) { }, error: function(err) { }});

至此,整個(gè)流程完結(jié)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: JavaScript
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品不卡一区二区三区| 悠悠色在线精品| 国产在线精品二区| 亚洲成色最大综合在线| 国产日韩综合av| 国产主播一区二区三区| 国产精品va| 亚洲男女自偷自拍| 日韩电影在线一区二区三区| 国产精品久久久久影院亚瑟 | 欧美视频一区二区| 国产欧美日韩在线观看| 国产伦精品一区二区三区免费迷| 伊人成人在线| 久久九九久精品国产免费直播| 国产综合久久久久影院| 久久久久久婷| 一区二区三区中文在线| 黑人巨大精品欧美一区二区小视频| 欧美一区二区网站| 精品一区二区三区影院在线午夜| 一本久久精品一区二区| 亚洲综合视频在线| 97精品久久久久中文字幕 | 国产一区999| 91精品1区2区| 亚洲激情在线播放| 激情综合自拍| 久久久久久99精品| 成人国产一区二区三区精品| 日韩一区二区中文字幕| 蜜桃久久久久久久| 欧洲一区在线电影| 日韩成人dvd| 久热综合在线亚洲精品| 天天综合天天做天天综合| 国产精品久久亚洲7777| 一区二区三区成人在线视频| 亚洲香蕉网站| 亚洲欧美日韩国产另类专区| 国内精品久久久久国产盗摄免费观看完整版 | 女生裸体视频一区二区三区| 亚洲精品一区二区三区影院| 成人激情午夜影院| 欧美mv日韩mv国产网站| 91美女视频网站| 中文字幕av一区二区三区高| 粉嫩一区二区三区性色av| 日韩欧美中文字幕精品| 成人夜色视频网站在线观看| 欧美电视剧免费全集观看| 99精品热视频| 精品国产区一区| 91亚洲国产成人精品一区二区三| 久久久久久久久99精品| 欧美视频官网| 亚洲男人的天堂一区二区| 亚洲尤物影院| 亚洲成人先锋电影| 欧美中文字幕不卡| 国产精品主播直播| 欧美大片一区二区| 欧美激情亚洲| 亚洲少妇屁股交4| 国产精品久久久久毛片大屁完整版| 亚洲精品国产视频| 久久久久一区二区| 日韩成人免费电影| 欧美日韩一区二区三区在线看| 麻豆精品一二三| 这里只有精品电影| 99久精品国产| 亚洲欧洲三级电影| 香蕉视频成人在线观看 | 日本在线不卡视频| 欧美福利视频一区| 91无套直看片红桃| 亚洲欧美日韩国产成人精品影院| 欧美激情aⅴ一区二区三区| 中文字幕av一区二区三区高| 91麻豆免费在线观看| 久久久777精品电影网影网| 久久久精品五月天| 99re这里只有精品6| 首页综合国产亚洲丝袜| 久久久久久久免费视频了| 久久精品国产综合精品| 97久久超碰国产精品电影| 亚洲一区二区欧美| 精品国产一区二区精华| 久久精品日产第一区二区| 91网页版在线| 久久er99热精品一区二区| 1区2区3区欧美| 欧美日韩高清一区二区三区| 一色屋精品视频在线观看网站| 国产综合久久久久久久久久久久| 国产精品久久福利| 91精品国产免费久久综合| 亚洲全部视频| av电影天堂一区二区在线观看| 日韩av中文在线观看| 国产精品久99| 日韩视频中午一区| 91电影在线观看| 亚洲国内精品| 99国产精品国产精品久久| 久久疯狂做爰流白浆xx| 亚洲乱码国产乱码精品精可以看| 精品免费视频.| 91福利社在线观看| 在线 亚洲欧美在线综合一区| 国产精品一区免费在线观看| 亚洲一区在线免费观看| 国产亚洲成av人在线观看导航| 欧美日韩亚洲不卡| 亚洲女人av| 尤物在线精品| 91美女片黄在线观看| 日韩不卡免费视频| 亚洲午夜激情| 韩国精品一区二区三区| 好看不卡的中文字幕| 精品亚洲成a人| 国模套图日韩精品一区二区| 久久久精品黄色| 亚洲欧美网站| 亚洲欧美激情一区二区| 日韩欧美一区二区三区在线| 在线免费视频一区二区| 亚洲精品孕妇| 欧美激情综合| 99久久精品国产麻豆演员表| 久久精品国产亚洲一区二区三区| 亚洲精品视频自拍| 日本一区二区三区免费乱视频| 日韩一区二区免费视频| 91国内精品野花午夜精品| 一区二区三区精品国产| 色综合夜色一区| 国产日韩亚洲| 亚洲伊人伊色伊影伊综合网| 三级在线观看一区二区| 亚洲美女少妇撒尿| 日韩欧美国产系列| 久久亚洲高清| 亚洲高清在线观看一区| 亚洲三级久久久| 这里只有精品电影| 蜜桃久久av| 亚洲精品激情| 亚洲午夜伦理| 91麻豆国产自产在线观看| 国产成人h网站| 国产一区在线看| 精品一区二区三区在线视频| 亚洲一区二区在线播放相泽| 中文字幕在线一区免费| 久久精品亚洲精品国产欧美kt∨ | 欧美日韩视频在线第一区 | 中文字幕人成不卡一区| 久久久久免费观看| 精品国产电影一区二区| 日韩欧美电影一二三| 日韩视频免费观看高清完整版 | 欧美一级片免费看| 91精品国产乱码久久蜜臀| 欧美精品v国产精品v日韩精品| 欧美日韩中文另类| 欧美亚洲一区二区三区四区| 欧美三区在线观看| 欧美日韩免费不卡视频一区二区三区| 91久久精品一区二区| 欧美性猛交xxxxxxxx| 精品视频一区二区三区免费| 6080国产精品一区二区| 日韩欧美激情一区| 久久久久久久久99精品| 国产色产综合产在线视频| 久久久久久久久久久久电影| 日本一区二区三区电影| 亚洲婷婷综合久久一本伊一区| 日韩理论片网站| 亚洲午夜激情网站| 日本aⅴ免费视频一区二区三区| 免费精品视频最新在线| 国产一区二区影院| 成人午夜免费av| 欧美激情五月| 一本久道久久久| 可以免费看不卡的av网站| 欧美日韩一区国产| 欧美一区永久视频免费观看| 精品区一区二区| 国产精品理伦片| 一区二区高清免费观看影视大全 | 红桃视频亚洲| 国产精品一级| 欧美在线免费观看亚洲| 在线不卡的av|