十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
使用canvas怎么實(shí)現(xiàn)一個拼圖功能?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括勉縣網(wǎng)站建設(shè)、勉縣網(wǎng)站制作、勉縣網(wǎng)頁制作以及勉縣網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,勉縣網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到勉縣省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
實(shí)現(xiàn)的思路其實(shí)挺簡單的,主要是通過服務(wù)端獲取圖片鏈接,圖片寬度,圖片高度,然后利用簡單的遞歸實(shí)現(xiàn)就行了(注意移動端需要采用2倍數(shù)的比例,否則會出現(xiàn)圖片模糊的問題)
/** * canvas繪圖數(shù)據(jù) * @param {Object[]} option.photoData * @param {string} option.photoData[].photo - 照片的鏈接地址 * @param {number} option.photoData[].width - 照片的寬度 * @param {number} option.photoData[].height - 照片的高度 * @param {Object[]} option.wordData * @param {string} option.wordData[].color - 文字的顏色 * @param {number} option.wordData[].fontSize - 文字的大小 * @param {string} option.wordData[].fontWeight - 文字的粗細(xì) * @param {number} option.wordData[].left - 文字的左邊距 * @param {number} option.wordData[].top - 文字的上邊距 * @param {string} option.wordData[].word - 文字的內(nèi)容 * @param {Object[]} option.iconData * @param {string} option.iconData[].photo - icon的鏈接地址 * @param {number} option.iconData[].left - icon的左邊距 * @param {number} option.iconData[].top - icon的上邊距 * @param {number} option.iconData[].width - icon的寬度 * @param {number} option.iconData[].height - icon的高度 * */ function canvasDraw(option){ var canvas = document.createElement('canvas'), ctx = canvas.getContext('2d'), clientWidth = document.documentElement.clientWidth, canvasHeight = 0, distance = 0, photoCount = 0, iconCount = 0; // canvas中手機(jī)上一倍繪圖會模糊,需采用兩倍,pc端不會。 clientWidth = clientWidth > 480? 480 * 2 : clientWidth * 2; option.photoData.forEach(function(item,index,picArr){ if (!index) { item.distance = 0; }else if(index){ distance += Math.floor(clientWidth / option.photoData[index - 1].width * option.photoData[index - 1].height) item.distance = distance; } canvasHeight += Math.floor(clientWidth / item.width * item.height); item.imgHeight = Math.floor(clientWidth / item.width * item.height); }) console.log(option.photoData) if (ctx) { canvas.width = clientWidth; canvas.height = canvasHeight + clientWidth / 4 * 2 ctx.fillStyle = '#fff' ctx.fillRect(0, 0, canvas.width, canvas.height) // 繪制圖片文字 if(option.wordData.length){ option.wordData.forEach(function(item,index){ ctx.fillStyle = item.color; ctx.font = 'normal normal ' + item.fontWeight + ' ' + calculate(item.fontSize) + 'px Microsoft YaHei'; ctx.textAlign = 'left'; ctx.fillText(item.word, calculate(item.left), canvasHeight + calculate(item.top)); }) } //按比例計算不同手機(jī)的百分比間距 function calculate(num){ return Math.floor(clientWidth * num / 750) } drawPhoto('photo0') function drawPhoto(photoDom){ var photoDom = new Image(); photoDom.setAttribute('crossOrigin', 'Anonymous'); photoDom.src = option.photoData[photoCount].photo; photoDom.onload = function(){ ctx.drawImage(photoDom, 0, option.photoData[photoCount].distance, clientWidth, option.photoData[photoCount].imgHeight); photoCount++; if (photoCount == option.photoData.length) { drawIcon('icon0') function drawIcon(iconDom){ var iconDom = new Image(); iconDom.setAttribute('crossOrigin', 'Anonymous'); iconDom.src = option.iconData[iconCount].icon; iconDom.onload = function(){ ctx.drawImage(iconDom, calculate(option.iconData[iconCount].left), canvasHeight + calculate(option.iconData[iconCount].top), calculate(option.iconData[iconCount].width), calculate(option.iconData[iconCount].height)) iconCount++; if (iconCount == option.iconData.length) { var imageURL = canvas.toDataURL("image/jpeg") document.getElementsByClassName('shareImg')[0].setAttribute('src', imageURL) //將閉包引用清除,釋放內(nèi)存; drawPhoto = null; }else{ drawIcon('icon' + iconCount) } } } }else{ drawPhoto('photo'+ photoCount) } } } }else{ console.log('不支持canvas') } }
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。