亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

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

2024-08-26 00:20:01
字體:
來源:轉載
供稿:網友

寫在最前:

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

成果展示:

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容器,講圖片重回到里面了,整個過程就這樣結束,回頭看來是不是很簡單。

相關依賴:

 

復制代碼
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
黑人精品xxx一区| 国产精品欧美日韩| 综合网日日天干夜夜久久| 欧美另类在线观看| 国内自拍欧美激情| 国产成+人+综合+亚洲欧洲| 欧美性猛交xxxx富婆弯腰| 久精品免费视频| 中文字幕精品—区二区| 日韩精品免费综合视频在线播放| 国产亚洲精品久久久久久牛牛| 国产亚洲欧美日韩精品| 欧美xxxx18国产| 69av在线视频| 国产精品免费一区豆花| 91丝袜美腿美女视频网站| 国产精品人成电影| 国产精品高潮在线| 欧美在线视频观看免费网站| 国产欧美久久久久久| 91香蕉亚洲精品| 在线国产精品播放| 亚洲人免费视频| 欧美午夜影院在线视频| 日韩成人激情在线| 亚洲精品suv精品一区二区| 国产91精品在线播放| 国产精品久久久久91| 国产精品久久久久久中文字| 自拍偷拍亚洲一区| 久久影视免费观看| 亚洲va码欧洲m码| 欧美激情精品久久久久久大尺度| 91精品国产91久久久久久吃药| 在线视频一区二区| 国产成人精品免费视频| 亚洲天堂一区二区三区| 欧美激情欧美激情在线五月| 久久好看免费视频| 久久久久久久久久婷婷| 国产一区二区三区日韩欧美| 热99精品只有里视频精品| 91av网站在线播放| 日本伊人精品一区二区三区介绍| 欧美激情视频网| 国产成人精品久久二区二区| 国产视频丨精品|在线观看| 国产精品久久999| 91在线观看免费高清| 2019中文字幕在线免费观看| 国产精品三级网站| 国产欧美中文字幕| 视频在线观看一区二区| 日韩在线免费av| 97国产精品人人爽人人做| 精品国产成人av| 一区二区日韩精品| 永久免费看mv网站入口亚洲| 欧美日韩在线观看视频小说| 欧美性猛交xxxx免费看漫画| 亚洲人成在线免费观看| 亚洲第一色中文字幕| 69影院欧美专区视频| 中文字幕日韩欧美精品在线观看| 亚洲成人中文字幕| 精品网站999www| 91国产精品视频在线| 欧洲成人免费视频| 日韩中文字幕免费视频| 精品久久久久久久久久| 成人精品一区二区三区| 精品国产91乱高清在线观看| 国产精品黄色av| 国产精品99一区| 欧美精品在线观看91| 久久视频在线观看免费| 国产视频999| 一个人www欧美| 国产成人精品一区| 欧亚精品在线观看| 青草热久免费精品视频| 91久久久久久久久久久| 欧美激情精品久久久久久大尺度| 欧美另类在线播放| 色综合老司机第九色激情| 亚洲成人中文字幕| 精品国产老师黑色丝袜高跟鞋| 国产婷婷成人久久av免费高清| 92看片淫黄大片看国产片| 在线日韩欧美视频| 亚洲曰本av电影| 国产精品美乳在线观看| 欧美亚洲激情视频| 欧美日韩999| 日韩欧美中文第一页| 国产香蕉97碰碰久久人人| 91精品国产777在线观看| 国内精品免费午夜毛片| 狠狠躁18三区二区一区| 不卡中文字幕av| 77777亚洲午夜久久多人| 国产精品偷伦免费视频观看的| 久久五月情影视| 国产精品99久久久久久人| 亚洲在线观看视频| 日韩电影免费观看在线| 亚洲精品日韩在线| 国产精品va在线播放| 欧美激情videos| 久久久久亚洲精品成人网小说| 国产精品女人久久久久久| 日韩精品中文字幕在线观看| 久久久精品免费视频| 欧美日韩黄色大片| 久久91超碰青草是什么| 亚洲一区二区三区四区视频| 日韩www在线| 日韩一级黄色av| 亚洲日韩欧美视频一区| 国产精品嫩草影院久久久| 中文字幕欧美视频在线| 午夜精品久久久久久久99热浪潮| 91精品国产精品| 国产一区二区美女视频| 久久久国产一区二区三区| 亚洲无线码在线一区观看| 91日本视频在线| 久久久精品一区| 一本一本久久a久久精品综合小说| 国产精品丝袜白浆摸在线| 亚洲精品日韩久久久| 久久久久久com| 亚洲一区二区三区乱码aⅴ| 欧美精品18videos性欧美| 欧美久久精品一级黑人c片| 亚洲国产小视频| 国产精品美女久久久久av超清| 欧美激情视频给我| 深夜福利91大全| 668精品在线视频| 亚洲激情国产精品| 国产在线拍揄自揄视频不卡99| 国产精品欧美激情在线播放| 欧美激情aaaa| 亚洲区中文字幕| 午夜精品免费视频| 欧美激情在线观看视频| 欧洲成人性视频| 国产精品美女主播| 亚洲天天在线日亚洲洲精| 国产精品女主播视频| 日韩一区二区欧美| 这里只有精品久久| 亚洲免费av电影| 97久久国产精品| 91精品国产自产在线老师啪| 视频在线观看一区二区| 亚洲最大福利视频网| 亚洲欧美色婷婷| 欧美高清理论片| 国模精品视频一区二区三区| 成人精品福利视频| 久久精品免费电影| 91tv亚洲精品香蕉国产一区7ujn|