日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JavaScript基于用戶照片姓名生成海報

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

前言

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

需求描述

用戶點擊按鈕進行照片上傳 照片上傳完成后,將照片進行裁剪,并和海報背景、姓名等組合得到海報 將生成的海報上傳

效果大概如下:

海報背景:

JavaScript基于用戶照片姓名生成海報

成品:

JavaScript基于用戶照片姓名生成海報

實現過程

1、初始化 canvas

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

2、繪制海報背景

海報背景為預先提供的一張照片,將其設置到一個隱藏的 img 標簽里面,并且預留一個 canvas 元素用于繪制海報:

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

頁面加載完成后,將海報背景繪制到 canvas 內:

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

海報背景繪制完成之后,需要將用戶姓名繪制到特定位置。由于用戶姓名長度不一,因此需要進行計算確定字體大小:

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 元素,因為頁面上表現為點擊按鈕,因此使用經典的將 input 元素透明化并覆蓋按鈕的方法:

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

然后監聽 input 元素的 change 事件,然后使用 FormData API 構造表單數據,使用 ajax 進行異步上傳,照片上傳完成之后。得到一個地址,將這個地址設置到頁面上預留的一個 img 標簽里面:

$(’#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(’請上傳 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、繪制照片

海報中放置照片的區域為正方形,但是用戶上傳的照片卻不一定,因此需要對照片進行裁剪,裁剪的原則為取照片中間部分。然后將裁剪參數傳進 canvas 的 drawImage 方法,進行繪制:

$(’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(); });

前面繪制海報背景和這里繪制照片,調用的是同一個方法,只不過后者多傳進去了裁剪參數。但是需要注意的是,裁剪參數是在繪制位置之前傳進去的,而不是簡單的補在后面:

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

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

5、上傳海報

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

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

其它瀏覽器里,可以先用 toDataURL方法得到 base64 格式的圖片數據,再轉為 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});}

然后進行上傳,步驟和前面上傳照片一致:

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) { }});

至此,整個流程完結。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩精品一区二区三区视频 | 国产色播av在线| 久久av超碰| 福利一区二区免费视频| 国产传媒av在线| 国产精品88久久久久久| 老司机精品久久| 日本午夜精品视频在线观看| 美女91精品| 国产剧情一区| 人人草在线视频| 黄色成人91| 日韩国产一区二| 狠狠久久伊人中文字幕| 国产v综合v| 亚洲欧美日韩专区| 久久99精品久久久野外观看| 国产精品久久久久av电视剧| 亚洲国内精品| 国产精品亚洲四区在线观看| 欧美成人a交片免费看| 鲁大师影院一区二区三区| 精品久久免费| 日韩中文av| 国产日韩免费| 婷婷精品视频| 国产精品22p| 夜夜嗨一区二区三区| 欧美日韩1区2区3区| 欧美aa在线观看| 日韩精品乱码av一区二区| 高清一区二区| 亚洲97av| 日韩另类视频| 婷婷久久免费视频| 色婷婷久久久| 精品三级av| 青青草国产成人99久久| 裤袜国产欧美精品一区| 综合国产在线| 国产一区久久| 福利一区二区三区视频在线观看| 蜜桃一区二区三区在线观看| caoporn视频在线| 国产精品18| 日韩av影院| 亚洲免费毛片| 首页国产欧美久久| 伊人精品一区| 亚洲成人av观看| 超碰超碰人人人人精品| 美女视频黄 久久| 国产精品色婷婷在线观看| 九色精品91| 日韩午夜精品| 欧美日韩国产免费观看| 亚洲91视频| 久久精品免费一区二区三区 | 欧美激情91| 日韩精彩视频在线观看| 亚洲综合图色| 蜜臀精品一区二区三区在线观看 | 国产成人精选| 午夜性色一区二区三区免费视频| 日韩免费视频| 香蕉久久精品| 国产视频一区欧美| 亚洲精品字幕| 日本视频一区二区| 久久精品一区二区国产| 国产一区二区三区日韩精品| 国产精品极品在线观看| 美女视频一区在线观看| 日产精品一区二区| 激情欧美一区二区三区| 亚洲一区有码| 久久99精品久久久久久园产越南| 精品国产三区在线| 91久久久精品国产| 婷婷亚洲成人| 日本不卡免费高清视频在线| 欧美xxxx中国| 男女性色大片免费观看一区二区| 国产图片一区| 亚洲一级二级| 亚洲日产国产精品| 欧美国产日本| 亚洲综合另类| 黄色aa久久| 欧美一区影院| 视频福利一区| 日韩欧美中文字幕电影| 国产精品毛片久久| 亚洲一区二区网站| 久久精品国产亚洲aⅴ| 亚洲一区亚洲| 日韩一区亚洲二区| 7777精品| 久久亚洲二区| 亚洲婷婷免费| 另类专区亚洲| 国产视频一区二| 夜夜嗨一区二区| 国产在线看片免费视频在线观看| 亚洲欧美日韩专区| 日韩一区二区三区在线免费观看| 国产乱码精品一区二区亚洲| 9色国产精品| 色婷婷狠狠五月综合天色拍| 国产日韩一区二区三免费高清| 伊人精品视频| 国产在线|日韩| 亚洲国产欧美日本视频| 国产精品mm| 欧美一区二区三区久久| 亚洲ww精品| 日韩中文字幕麻豆| 日韩亚洲在线| 欧美在线资源| 欧美日韩日本国产亚洲在线| 欧产日产国产精品视频| 黑人精品一区| 国产传媒在线观看| 中国字幕a在线看韩国电影| 成人国产精品久久| 久久精品毛片| 精品免费视频| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 亚洲欧洲美洲国产香蕉| 鲁大师影院一区二区三区| 国产毛片久久| 亚洲一二av| 日韩av成人高清| 国产精品一区二区中文字幕| 国产日韩精品视频一区二区三区| 中文字幕一区二区三区在线视频| 亚洲毛片一区| 91精品视频一区二区| 国产精品日本一区二区不卡视频| 国产欧美在线| 国产黄大片在线观看| 欧美va亚洲va日韩∨a综合色| 亚洲婷婷免费| 日韩一区二区三区精品视频第3页| 国产欧美91| 国产成人免费视频网站视频社区| 国产66精品| 日av在线不卡| 免费一级欧美片在线观看网站 | 免费久久99精品国产自在现线| 久久亚洲一区| 国产精品扒开腿做爽爽爽软件| 麻豆视频一区| 亚洲男女av一区二区| 日韩avvvv在线播放| 成人精品高清在线视频| 99国产精品| 欧美精品aa| 国产精品日韩久久久| 国产精品大片| 日韩精品免费一区二区在线观看 | 日韩av一二三| 久久精品影视| 国产精品手机在线播放| 免费观看不卡av| 麻豆视频久久| 亚洲欧美在线专区| 国产一区视频在线观看免费| 国产精品伊人| 亚洲一区二区三区中文字幕在线观看| 久久国产精品久久w女人spa| 欧美一级网站| 99国产精品私拍| 色欧美自拍视频| 欧美精品国产| 日韩有码av| 国产一区二区精品| 久久久久久夜| 精品国产亚洲一区二区三区| 亚洲精选av| 亚洲尤物在线| 日韩一区二区免费看| 亚洲www啪成人一区二区| 免费一级欧美在线观看视频| 亚洲精品一级二级三级| 亚洲一区国产| 亚洲一级黄色| 欧洲毛片在线视频免费观看| 美女高潮久久久| 久久精品伊人| 久久香蕉网站| 日韩成人a**站| 四虎国产精品免费观看| 精品资源在线| 在线看片福利| 亚洲性图久久| 亚洲欧美日韩专区| 亚洲麻豆一区| 国产一精品一av一免费爽爽| 91成人在线网站|