校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > canvas之自定義頭像功能實現代碼示例

canvas之自定義頭像功能實現代碼示例

熱門標簽:云南大理400電話申請官方 南寧點撥外呼系統哪家公司做的好 成都智能外呼系統平臺 鎮江智能外呼系統有效果嗎 當涂高德地圖標注 電銷機器人電話用什么卡 江蘇智能電銷機器人哪家好 黃島區地圖標注 四川點撥外呼系統

寫在最前:

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

成果展示:

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

功能說明:

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

實現細節:

因為你要對圖片所在的區域進行截圖,所以你得制作一張canvas,蓋在圖片所在的區域。這里,我們給出了一個函數,根據傳入的DOM里面元素的類名創建相同位置的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你就可以在你圖片所在區域肆意的操作了。首先,降整個區域畫上一個淺黑色的陰影,然后再擦除初始小方框區域里面的顏色。然后給整個頁面添加mousedown,mousemove,mouseup事件,他們所做的功能就跟你在頁面中實現一個拖拽的功能類似,這里重點說下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');
    //移動小方框
    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;

        //判斷方框是否達到邊界
        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;
        //拖動時邊界條件的判斷
        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;
    }                            
}

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

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

我們說下這個函數的作用,這里我們要注意一個參數imageURL,這個URL是由圖片所在的DOM轉化來的。因為你要把DOM所在的區域變成一張圖片,這樣你才能在利用drawImage函數截取你所需要的區域。所以我們先利用html2canvas庫函數講圖片所在的DOM轉化為canvas,這張canvas的內容是包含你所要截取的圖片的,然后把這張canvas轉化為圖片取得圖片地址imageURL,代碼如下:

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

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

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

相關依賴:


復制代碼
代碼如下:

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

寫在最后:

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

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

標簽:佳木斯 淮安 十堰 西寧 咸寧 酒泉 廣西 南京

巨人網絡通訊聲明:本文標題《canvas之自定義頭像功能實現代碼示例》,本文關鍵詞  canvas,之,自定義,頭像,功能,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《canvas之自定義頭像功能實現代碼示例》相關的同類信息!
  • 本頁收集關于canvas之自定義頭像功能實現代碼示例的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    欧美经典一区二区| 春色校园综合激情亚洲| 国产精品一区二区在线观看不卡| 99久久久久免费精品国产| 欧美一区二区在线看| 国产精品美女久久久久久2018 | 欧美熟乱第一页| 国产日韩欧美高清| 麻豆成人91精品二区三区| 日本韩国精品一区二区在线观看| 久久噜噜亚洲综合| 蜜臀av一区二区| 欧美日韩国产一区| 亚洲三级在线免费| av电影天堂一区二区在线观看| 日韩亚洲国产中文字幕欧美| 亚洲高清在线精品| 色悠久久久久综合欧美99| 中文字幕va一区二区三区| 精品一区二区三区香蕉蜜桃| 欧美高清视频在线高清观看mv色露露十八 | 亚洲精品成a人| 国产91精品露脸国语对白| 精品国产第一区二区三区观看体验| 国产精品视频在线看| 国产精品一区二区在线看| 精品国产免费人成电影在线观看四季| 亚洲最大成人综合| 在线观看亚洲专区| 亚洲免费观看高清完整版在线 | 亚洲欧美日韩电影| 99在线精品免费| 日韩一区欧美一区| 91在线一区二区| 亚洲精品你懂的| 欧美优质美女网站| 一区二区三区在线视频免费 | 成人精品视频一区二区三区| 国产欧美日韩在线视频| 成人一区二区在线观看| 国产精品区一区二区三区 | 麻豆91精品视频| 欧美成人video| 国产麻豆精品在线观看| 国产精品全国免费观看高清 | 欧美电影精品一区二区| 视频在线在亚洲| 日韩欧美国产小视频| 国产一区二区三区免费在线观看| 久久九九久精品国产免费直播| 国产成人免费视频网站高清观看视频| 国产清纯白嫩初高生在线观看91| 成人动漫一区二区在线| 亚洲激情综合网| 91精品啪在线观看国产60岁| 国产在线精品一区二区夜色 | 日韩黄色免费电影| 久久精品欧美日韩精品| 色偷偷88欧美精品久久久| 日韩高清不卡一区二区| 日韩一二在线观看| 成人三级在线视频| 午夜成人免费电影| 欧美激情综合五月色丁香小说| 日本精品免费观看高清观看| 另类中文字幕网| 亚洲欧洲日韩一区二区三区| 欧美日韩专区在线| 国产成人午夜精品5599| 亚洲aaa精品| 久久久久国产精品麻豆| 欧美日韩亚洲国产综合| 韩国精品久久久| 亚洲一区二区三区四区在线免费观看| 欧美一区二区三区电影| av一区二区不卡| 免费成人性网站| 一区二区三区四区在线免费观看| 精品免费视频.| 欧美视频在线观看一区二区| 国产suv一区二区三区88区| 日韩专区欧美专区| 亚洲视频香蕉人妖| 国产欧美日韩精品a在线观看| 欧美日韩精品一区二区在线播放| 成人免费毛片a| 九色综合狠狠综合久久| 亚洲午夜视频在线观看| 国产精品不卡一区| 久久久美女毛片| 欧美一区二区免费| 欧美亚洲尤物久久| 91捆绑美女网站| av资源网一区| 丁香婷婷综合网| 激情av综合网| 另类小说欧美激情| 婷婷国产v国产偷v亚洲高清| 国产精品久久久久婷婷| 久久久久久久久蜜桃| 欧美一级xxx| 欧美精品第一页| 欧美视频精品在线| 在线看国产一区二区| 91小视频免费观看| 成人av网在线| 粉嫩av一区二区三区粉嫩 | 久久久精品国产免大香伊| 日韩色视频在线观看| 7777精品伊人久久久大香线蕉经典版下载| 91在线免费视频观看| 91在线无精精品入口| 91美女片黄在线观看| 不卡一二三区首页| 91视频在线看| 色婷婷一区二区| 欧美色欧美亚洲另类二区| 在线国产电影不卡| 欧美日韩美女一区二区| 91精品一区二区三区久久久久久| 欧美军同video69gay| 欧美一区午夜精品| 日韩欧美亚洲国产精品字幕久久久| 欧美一级夜夜爽| 欧美精品一区男女天堂| 久久美女艺术照精彩视频福利播放 | 成人国产电影网| 激情另类小说区图片区视频区| 久久99精品国产麻豆不卡| 国产中文一区二区三区| 成人午夜大片免费观看| 99久久99久久精品免费看蜜桃| 色综合一个色综合亚洲| 色av一区二区| 欧美一区二区视频在线观看2022| 日韩色在线观看| 国产精品美女视频| 亚洲国产色一区| 精品无人码麻豆乱码1区2区| 国产xxx精品视频大全| 91久久精品日日躁夜夜躁欧美| 这里只有精品电影| 久久精品在这里| 亚洲一区二区三区爽爽爽爽爽| 日本一区中文字幕| 国产91在线观看丝袜| 欧美影视一区在线| 久久午夜羞羞影院免费观看| 亚洲欧洲精品一区二区三区| 亚洲国产综合91精品麻豆| 精品夜夜嗨av一区二区三区| 成人久久18免费网站麻豆| 777色狠狠一区二区三区| 欧美国产精品一区二区三区| 亚洲一级二级三级在线免费观看| 加勒比av一区二区| 色综合天天综合在线视频| 日韩精品资源二区在线| 一区二区三区高清| 久久91精品国产91久久小草| 色哟哟精品一区| 久久精品视频免费观看| 性久久久久久久久| 在线亚洲高清视频| 欧美不卡在线视频| 一区二区三区高清不卡| 国产九色sp调教91| 88在线观看91蜜桃国自产| 国产精品少妇自拍| 国产在线视视频有精品| 制服丝袜av成人在线看| 亚洲欧美综合另类在线卡通| 韩国女主播一区| 91精品国产入口| 亚洲一区免费观看| 91麻豆文化传媒在线观看| 久久久99久久| 久久国产视频网| 欧美日韩国产综合视频在线观看| 国产精品视频一二三区| 国内精品久久久久影院色 | 精品国产免费一区二区三区四区| 亚洲香肠在线观看| 欧洲一区在线电影| 亚洲婷婷综合久久一本伊一区| 懂色av中文字幕一区二区三区 | 国产一区二区成人久久免费影院| 777xxx欧美| 日韩av不卡一区二区| 欧美日韩午夜影院| 亚洲一二三区不卡| 色88888久久久久久影院按摩| 成人免费在线观看入口| 成人亚洲一区二区一| 久久精品欧美一区二区三区麻豆 | 久久久国产综合精品女国产盗摄| 极品瑜伽女神91| 久久众筹精品私拍模特| 九九国产精品视频| 久久综合给合久久狠狠狠97色69|