成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識(shí)庫 > canvas之自定義頭像功能實(shí)現(xiàn)代碼示例

canvas之自定義頭像功能實(shí)現(xiàn)代碼示例

熱門標(biāo)簽:云南大理400電話申請(qǐng)官方 南寧點(diǎn)撥外呼系統(tǒng)哪家公司做的好 成都智能外呼系統(tǒng)平臺(tái) 鎮(zhèn)江智能外呼系統(tǒng)有效果嗎 當(dāng)涂高德地圖標(biāo)注 電銷機(jī)器人電話用什么卡 江蘇智能電銷機(jī)器人哪家好 黃島區(qū)地圖標(biāo)注 四川點(diǎn)撥外呼系統(tǒng)

寫在最前:

前兩天老大跟我說老虎官網(wǎng)上那個(gè)自定義頭像的功能是flash實(shí)現(xiàn)的,沒有安裝過的還得手動(dòng)去“允許”falsh的運(yùn)行。所以讓我用canvas實(shí)現(xiàn)一個(gè)一樣的功能,嘿嘿,剛好最近也在研究canvas,所以欣然答應(yīng)(其實(shí),你沒研究過難道就不答應(yīng)么,哈哈哈哈哈~)

成果展示:

Git地址:https://github.com/ry928330/portraitDIY

功能說明:

  • 拖拽左側(cè)小方框,或者是鼠標(biāo)放在小方框右下角,點(diǎn)擊拉伸方框,方框覆蓋部分的圖片被自動(dòng)截取下來,然后再在右側(cè)的多個(gè)容器里面重繪。
  • 輸入寬高,自定義你需要訂制的頭像大小,目前只支持寬高相同的頭像圖片。

實(shí)現(xiàn)細(xì)節(jié):

因?yàn)槟阋獙?duì)圖片所在的區(qū)域進(jìn)行截圖,所以你得制作一張canvas,蓋在圖片所在的區(qū)域。這里,我們給出了一個(gè)函數(shù),根據(jù)傳入的DOM里面元素的類名創(chuàng)建相同位置的canvas,蓋在原來的DOM元素上面:

function createCanvasByClassName(tag) {
    var canvasInitialWidth = $('.' + tag).width();
    var canvasInitialHeight = $('.' + tag).height();
    var left = $('.' + tag).offset().left - $('.' + tag).parent('.portraitContainer').offset().left + 1;
    var top = $('.' + tag).offset().top - $('.' + tag).parent('.portraitContainer').offset().top + 1;
    //var left = $('.' + tag).offset().left + 1;
    //var top = $('.' + tag).offset().top + 1;
    clearCanvasObj.left = $('.' + tag).offset().left + 1;
    clearCanvasObj.top = $('.' + tag).offset().top + 1;
    // clearCanvasObj.left = left;
    // clearCanvasObj.top = top;
    var canvasElement = $('<canvas></canvas>');
    var randomNum = Math.floor(getRandom(0, 10000));
    clearCanvasObj.canvasId = randomNum;
    canvasElement.attr({
        id: 'canvas',
        width: canvasInitialWidth,
        height: canvasInitialHeight
    });
    canvasElement.css({
        position: 'absolute',
        top: top, 
        left: left
    });
    //$('body').append(canvasElement);
    var appendEle = $('.portraitContainer').append(canvasElement);
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    //ctx.fillStyle = "rgba(211,211,216,0.5)";
    ctx.clearRect(0, 0, canvasInitialWidth, canvasInitialHeight);
    ctx.fillStyle = "rgba(0,0,0, 0.4)";
    ctx.fillRect(0, 0, canvasInitialWidth, canvasInitialHeight);
    return canvas;
}

有了這張canvas你就可以在你圖片所在區(qū)域肆意的操作了。首先,降整個(gè)區(qū)域畫上一個(gè)淺黑色的陰影,然后再擦除初始小方框區(qū)域里面的顏色。然后給整個(gè)頁面添加mousedown,mousemove,mouseup事件,他們所做的功能就跟你在頁面中實(shí)現(xiàn)一個(gè)拖拽的功能類似,這里重點(diǎn)說下mousemove里面做的操作,代碼如下:

function mousemoveFunc(event) {
    /* Act on the event */
    var nowMouseX = event.clientX - clearCanvasObj.left;
    var nowMouseY = event.clientY - clearCanvasObj.top;
    if (nowMouseX >= clearCanvasObj.xStart && nowMouseX <= clearCanvasObj.xStart + clearCanvasObj.width && nowMouseY >= clearCanvasObj.yStart && nowMouseY <= clearCanvasObj.yStart + clearCanvasObj.height) {
        clearCanvasObj.isCanvasArea = true;
        //clearCanvasObj.isRightCorner = false;
        imgContainerCanvas.style.cursor = 'move';
    } else if ((nowMouseX >= clearCanvasObj.xStart + clearCanvasObj.width - 10) && (nowMouseX <= clearCanvasObj.xStart+ clearCanvasObj.width + 10) 
        && (nowMouseY >= clearCanvasObj.yStart + clearCanvasObj.height - 10) && (nowMouseY <= clearCanvasObj.yStart + clearCanvasObj.height + 10)) {
        clearCanvasObj.isCanvasArea = true;
        //clearCanvasObj.beginDraw = false;

        imgContainerCanvas.style.cursor = 'se-resize';
    } 
    else {
        clearCanvasObj.isCanvasArea = false;
        //clearCanvasObj.isRightCorner = false;
        imgContainerCanvas.style.cursor = 'default';
    }
    var outerDomWidth = $(".imgContainer").width();
    var outerDomHeight = $(".imgContainer").height();
    var xDistance = event.clientX - clearCanvasObj.mouseX;
    var yDistance = event.clientY - clearCanvasObj.mouseY;
    //var outerCTX = canvas.getContext('2d');
    //移動(dòng)小方框
    if (clearCanvasObj.beginDraw && clearCanvasObj.isCanvasArea && !clearCanvasObj.isRightCorner) {
        ry_CTX.fillStyle = clearCanvasObj.color;
        // console.log('1', clearCanvasObj.xStart, clearCanvasObj.yStart)
        ry_CTX.fillRect(clearCanvasObj.xStart, clearCanvasObj.yStart, clearCanvasObj.width, clearCanvasObj.height);
        //outerCTX.fillRect(0, 0, canvas.width, canvas.height);
        clearCanvasObj.xStart += xDistance;
        clearCanvasObj.yStart += yDistance;

        //判斷方框是否達(dá)到邊界
        if (clearCanvasObj.xStart <= 0) {
            clearCanvasObj.xStart = 0;
        }
        if (clearCanvasObj.yStart <= 0) {
            clearCanvasObj.yStart = 0;
        }
        if ((clearCanvasObj.xStart + clearCanvasObj.width) >= outerDomWidth) {
            clearCanvasObj.xStart = outerDomWidth - clearCanvasObj.width;
        }
        if ((clearCanvasObj.yStart + clearCanvasObj.height) >= outerDomHeight) {
            clearCanvasObj.yStart = outerDomHeight - clearCanvasObj.height;
        }
        // console.log('2', clearCanvasObj.xStart, clearCanvasObj.yStart)
        ry_CTX.clearRect(clearCanvasObj.xStart, clearCanvasObj.yStart, clearCanvasObj.width, clearCanvasObj.height);
        produceSmallPic(clearCanvasObj.xStart+clearCanvasObj.left, clearCanvasObj.yStart+clearCanvasObj.top, clearCanvasObj.width, clearCanvasObj.height, imageURL)
        clearCanvasObj.mouseX = event.clientX;
        clearCanvasObj.mouseY = event.clientY;
    }
    //拖拽小方框
    if (clearCanvasObj.isRightCorner) {
        ry_CTX.fillStyle = clearCanvasObj.color;
        ry_CTX.fillRect(clearCanvasObj.xStart, clearCanvasObj.yStart, clearCanvasObj.width, clearCanvasObj.height);
        var realDistance = Math.min(xDistance, yDistance)
        clearCanvasObj.width +=  realDistance;
        clearCanvasObj.height += realDistance;
        //拖動(dòng)時(shí)邊界條件的判斷
        if (clearCanvasObj.xStart + clearCanvasObj.width >= outerDomWidth) {
            clearCanvasObj.width = outerDomWidth - clearCanvasObj.xStart;
            clearCanvasObj.height = outerDomWidth - clearCanvasObj.xStart;
        }
        if (clearCanvasObj.yStart + clearCanvasObj.height >= outerDomHeight) {
            clearCanvasObj.width = outerDomHeight - clearCanvasObj.yStart;
            clearCanvasObj.height = outerDomHeight - clearCanvasObj.yStart;
        }
        if (clearCanvasObj.width <= 10) {
            clearCanvasObj.width = 10;
        }
        if (clearCanvasObj.height <= 10) {
            clearCanvasObj.height = 10;
        }
        ry_CTX.clearRect(clearCanvasObj.xStart, clearCanvasObj.yStart, clearCanvasObj.width, clearCanvasObj.height);
        produceSmallPic(clearCanvasObj.xStart+clearCanvasObj.left, clearCanvasObj.yStart+clearCanvasObj.top, clearCanvasObj.width, clearCanvasObj.height, imageURL);
        clearCanvasObj.mouseX = event.clientX;
        clearCanvasObj.mouseY = event.clientY;
    }                            
}

函數(shù)里面,你需要注意拖拽的邊界條件,一個(gè)是方框不能拖到圖片所在DOM外的邊界;另外一個(gè)就是當(dāng)你鼠標(biāo)放在小方框所在的區(qū)域改變鼠標(biāo)的樣式。方框在拖動(dòng)的過程中,我們不斷重繪方框移動(dòng)的區(qū)域(也就是不斷的畫上陰影),然后在新的位置調(diào)用clearRect函數(shù),重新擦出一個(gè)小方框出來。在拖拽或是拉伸的過程中,我們會(huì)不斷調(diào)用produceSmallPic函數(shù),在右邊的容器(每個(gè)容器都是一個(gè)canvas)里面不斷根據(jù)容器大小重繪出所需的頭像。代碼如下:

function produceSmallPic(imageURL,left, top, width, height) {
    var img = new Image();
    img.src = imageURL;
    var targetCtx = new Array();
    var targetCanvas = null;
    img.onload = function() {
        portraitGroupsArr.forEach(function(item, index) {
            targetCanvas = document.getElementById(item.class);
            targetCtx.push(targetCanvas.getContext('2d'));
            targetCtx[index].clearRect(0,0, item.width, item.height);
            targetCtx[index].drawImage(img, left - clearCanvasObj.left, top - clearCanvasObj.top, width, height, 0, 0 , item.width, item.height);
        })
    }
}

我們說下這個(gè)函數(shù)的作用,這里我們要注意一個(gè)參數(shù)imageURL,這個(gè)URL是由圖片所在的DOM轉(zhuǎn)化來的。因?yàn)槟阋袲OM所在的區(qū)域變成一張圖片,這樣你才能在利用drawImage函數(shù)截取你所需要的區(qū)域。所以我們先利用html2canvas庫函數(shù)講圖片所在的DOM轉(zhuǎn)化為canvas,這張canvas的內(nèi)容是包含你所要截取的圖片的,然后把這張canvas轉(zhuǎn)化為圖片取得圖片地址imageURL,代碼如下:

html2canvas(document.getElementById('imgContainer'), {
        onrendered: function(canvas) {
            var imageURL = canvasTransToImage(canavs);
            ...
        }

})
function canvasTransToImage(canvas) {
    var imageURL = canvas.toDataURL('image/png');
    return imageURL;
}

接著,你就可以便利右側(cè)的canvas容器,講圖片重回到里面了,整個(gè)過程就這樣結(jié)束,回頭看來是不是很簡單。

相關(guān)依賴:


復(fù)制代碼
代碼如下:

<script src="<a ></script</a>>

寫在最后:

canvas的操作,要多多注意那些邊界條件,什么時(shí)候該重繪什么時(shí)候該清除,這些是比較重要的。邏輯清晰了,canvas本身的API也就那么幾個(gè),操作起來也就沒那么麻煩了,最后,謝謝大家查閱,寫的不是很清楚,有不懂的可以一起討論~

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:佳木斯 淮安 十堰 西寧 咸寧 酒泉 廣西 南京

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《canvas之自定義頭像功能實(shí)現(xiàn)代碼示例》,本文關(guān)鍵詞  canvas,之,自定義,頭像,功能,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《canvas之自定義頭像功能實(shí)現(xiàn)代碼示例》相關(guān)的同類信息!
  • 本頁收集關(guān)于canvas之自定義頭像功能實(shí)現(xiàn)代碼示例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧洲精品久久久久毛片完整版| 免费国产自久久久久三四区久久| 一区二区三区黄色| 国产精品大陆在线观看| 国产精品一区二区在线观看网站| 欧美日韩中字| 都市激情亚洲综合| 久久精品a一级国产免视看成人| 精品网站在线| 影音先锋男人看片资源| 性欧美暴力猛交另类hd| 久久久久久久综合日本| 香蕉网在线播放| 先锋影音av321| 美女高潮在线观看| 亚洲欧美日韩一区二区| 欧美日韩中文字幕在线观看| 免费观看又色又爽又黄的网站| 国产精品男人爽免费视频1| 中文字幕欧美日韩在线| 两个人看的免费完整在线观看| 大胆国模一区二区三区| 国产乱淫av片免费| 久久精品国产一区| 精品视频无码一区二区三区| 午夜写真片福利电影网| 女教师淫辱の教室蜜臀av软件| 无圣光视频在线观看| 狠狠人妻久久久久久综合蜜桃| 亚洲精品www久久久久久| 午夜性色福利视频| 91免费在线播放| 最近最新mv在线观看免费高清| 人人妻人人澡人人爽人人精品| 亚洲精品久久久久中文字幕二区| 这里只有久久精品视频| 不卡av一区二区| 亚洲国产aⅴ精品| 成人综合激情网| 精品成人一区| 一区二区三区入口| 精品高清一区二区三区| 精品久久中出| 四虎国产精品免费| 欧美夫妻性生活视频| 国产尤物在线播放| 欧美国产日韩精品| 日韩中文字幕在线视频观看| 日韩精彩视频| 污网站免费在线观看| 国产欧美久久久久久久久| 精品国产午夜福利在线观看| 亚洲综合影院| 日韩理论片一区二区| 水蜜桃免费高清视频在线播放| 欧美激情一区二区三区成人| 国产不卡一区二区在线播放| 国产欧美精品一区二区三区四区| 欧美jizzhd精品欧美满| 国产精品二区一区二区aⅴ污介绍| 久久先锋影音av| 黄色的电影在线-骚虎影院-骚虎视频| 伊人青青综合网| 999www成人| 日韩精品――色哟哟| 国产aⅴ精品一区二区三区久久| 影音先锋国产在线| 久久久天堂国产精品女人| 欧美日韩亚洲综合一区二区三区激情在线| 一区二区三区不卡视频在线观看| 亚洲另类在线观看| 欧美四级电影在线观看| 亚洲免费不卡视频| 九九热播视频在线精品6| 精品一区二区三区自拍图片区| 精品欧美国产一区二区三区| 500福利第一精品导航| 羞羞视频在线观看欧美| aa级大片欧美三级| 97人人做人人爱| 亚洲精品国产手机| 亚洲日韩欧美视频| 日韩av在线影院| 精品国产一区二区三区久久久| 蜜桃视频一区二区三区| 青青青免费在线| 黄色一级视频在线观看| 久久综合激情| 欧美日韩精品区| 成人女人a毛片在线看| 性高湖久久久久久久久aaaaa| 亚洲天堂久久新| 日本少妇全体裸体洗澡| 最美情侣韩剧在线播放| 欧美国产高潮xxxx1819| 3d动漫精品啪啪| 四虎成人在线播放| 国产精品18在线| 美女视频在线免费| 中文字幕人成高清视频| 好吊日精品视频| 波多野结衣av在线| 一本色道久久88亚洲综合88| 精品国产亚洲av麻豆| 亚洲欧美一区二区三区孕妇| 亚洲另类欧美日韩| 国产91在线精品| 欧美精品在欧美一区二区少妇| 精品国产人成亚洲区| 精品久久久久久久| 尤物网站在线看| 爱爱视频免费在线观看| 国产精品com| 在线一区二区三区做爰视频网站| 91久久香蕉国产日韩欧美9色| www.91视频| 成人福利视频在线| 国产精品亚洲人在线观看| 欧美成人激情免费网| 群体交乱之放荡娇妻一区二区| 久久免费国产| 精精国产xxxx视频在线中文版| 国产一区二区视频免费观看| 亚洲国产99精品国自产| 成人午夜在线播放| 一个人免费观看在线视频www| 黄色小视频免费| 狠狠狠色丁香婷婷综合久久五月| 品久久久久久久久久96高清| 久热这里只有精品6| 精品久久精品| 亚洲va在线观看| 国产综合精品一区二区三区| fc2ppv完全颜出在线播放| 亚洲欧美一区二区三区孕妇| √天堂8在线网| 最近中文字幕大全中文字幕免费| 国产激情在线免费观看| 久久久精品少妇| av免费精品一区二区三区| 成人毛片100部免费看| 精品三级av| 男插女免费视频| 播五月开心婷婷综合| 天天做天天摸天天爽国产一区| 91久久在线| jizz.日本| 国产嫩草一区二区三区在线观看| 影音先锋欧美激情| 日本在线播放一区| 国产欧美一区二区三区在线老狼| 日本一区二区三区播放| 国产视频一区二区三区在线播放| 亚洲黄在线观看| 久久久午夜视频| www.在线视频| 久久久久99人妻一区二区三区| www国产亚洲精品久久麻豆| h视频在线观看免费网站| 欧美三级在线视频| 黄色在线观看网站| 欧美激情第3页| 丁香花高清在线观看完整版| 亚洲午夜精品一区 二区 三区| 亚洲欧美成人一区二区在线电影| 91麻豆制片厂| 苍井空浴缸大战猛男120分钟| 精品在线你懂的| 操bbb操bbb| 国产成都精品91一区二区三| 九九热精品视频在线播放| 色偷偷偷综合中文字幕;dd| 久久99精品久久久久婷婷| 熟女熟妇伦久久影院毛片一区二区| 久久99最新地址| 欧美一级一区二区三区| 国产在线视频网| 亚洲第一网站男人都懂| 国产成人精品一区二区三区视频| 一级黄色高清视频| 亚洲国产婷婷香蕉久久久久久| 亚洲精品午夜久久久| 日韩精品免费专区| 成人一二三区| 动漫一区二区| 亚洲永久精品视频| 久久99精品国产.久久久久久| 老司机午夜福利视频| a篇片在线观看网站| 黄色网址免费在线| 国产精品免费观看高清| 黄色片视频在线观看| www视频免费看| 夜夜爽夜夜操| 亚洲精品乱码久久久久久| 美女网站免费看| 97中文字幕| 五月天综合网站| 一级毛片在线播放| 精品国产亚洲一区二区三区在线观看| 国产精品午夜福利| 草草在线视频| jvid福利写真一区二区三区| 男人天堂新网址| 国产自偷自偷免费一区| 九九热视频这里只有精品| 日韩欧美理论片| 2025国产精品视频| 日韩视频第二页| 精品午夜一区二区三区| 欧美这里有精品| 精品一区二区三区久久| 国产精品玖玖玖| 免费污污网站| 国产成人黄色片| 少妇精品视频一区二区免费看| 久久精品日韩精品| 青青草国产精品一区二区| 国产日本韩国在线播放| 欧洲在线视频一区| 国产一区香蕉久久| 在线视频三区| www.97超碰| 一区二区三区av| 超碰91在线| 亚洲精品国产suv一区88| 精品国产不卡一区二区三区| 91av日本| 丁香花高清视频完整版在线观看| 国产精品一区二区亚洲| 欧美特黄级在线| 日本一区二区不卡高清更新| 一区二区三区四区日韩| 影音先锋在线播放| 久久精品色图| 极品美女销魂一区二区三区| 国产二区三区四区| 中文字幕在线中文字幕在线中三区| 麻豆91在线看| 久久天天躁狠狠躁夜夜爽蜜月| 夜先锋资源站| av网站观看| 欧美大片日本大片免费观看| 女生影院久久| 久久日.com| 97香蕉久久| 亚洲成av人**亚洲成av**| 日本三级在线播放完整版| 午夜视频在线观看精品中文| 亚洲欧美日韩成人高清在线一区| 清纯唯美日韩| 欧美videos粗暴高清性| www精品美女久久久tv| 雨宫琴音一区二区三区| 色88888久久久久久影院按摩| 黄页网站在线| 久久er99热精品一区二区三区| 日韩伦理在线观看| 久久免费精品一区二区| 欧美老肥婆性猛交视频| 国产性色一区二区| 欧美自拍偷拍午夜视频| 亚洲最大的成人av| 日韩欧美成人一区二区三区| 国产日产欧美视频| 亚洲一区在线观看免费| 波多野结衣黄色| 日韩av不卡在线观看| 亚洲成人精品一区二区| 国产小视频在线高清播放| 乱码一区二区三区| 免费观看国产精品视频| 国产黄色免费视频| 天天操天天综合网| 免费成人在线视频网站| 日本dvd播放| 午夜剧场成人观在线视频免费观看| 久久精品性爱视频| 成人黄色视屏网站| 理论视频在线观看| av中文字幕在线不卡| 国产一区二区三区不卡视频网站| 69精品丰满人妻无码视频a片| 高清不卡一区二区| 国产一区二区在线不卡| 亚洲综合精品伊人久久| 亚洲图片欧洲图片日韩av| 中文字幕成人在线视频| 另类综合日韩欧美亚洲| 久久人人97超碰com| 国产igao激情在线入口| 91久久久久久白丝白浆欲热蜜臀| 久久中文字幕在线视频| 精品国产18久久久久久洗澡| 色综合视频二区偷拍在线| 日本久久久久久久久| 国产精品欧美日韩| 91九色国产视频| 日韩精品免费一区二区在线观看| 欧美午夜激情在线| 神马午夜电影一区二区三区在线观看| 久久久精品免费免费| 777午夜精品电影免费看| 日本免费不卡| 日韩电影免费观| 欧美一区二区三区色| 色偷偷88欧美精品久久久| 麻豆成人av| 在线观看国产小视频| www.国产在线观看| 91久久国产精品| 久久伦理网站| 哪个网站能看毛片| 国产91精品黑色丝袜高跟鞋| 国产国语刺激对白av不卡| 国产精品主播一区二区| 欧美体内谢she精2性欧美| 制服丝袜一区二区三区| 一个人www视频在线免费观看| 久久精品在线免费视频| 国产精品制服诱惑| 亚洲久久久久久久久久久| 宅男在线一区| 日韩中文字幕在线不卡| 国产欧美va欧美va香蕉在线| 在线观看91精品国产麻豆| 国产精品免费久久久久影院| 国产剧情一区二区三区|