最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS+Canvas實現(xiàn)自定義頭像功能

 更新時間:2022年06月13日 15:04:19   作者:ryyyyy  
本文主要為大家詳細介紹了如何利用JS+Canvas實現(xiàn)自定義頭像功能,文中的示例代碼講解詳細,對我們學(xué)習(xí)有一定的幫助,感興趣的小伙伴可以了解一下

寫在最前

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

成果展示

Git地址

https://github.com/ry928330/portraitDIY.git

功能說明

拖拽左側(cè)小方框,或者是鼠標放在小方框右下角,點擊拉伸方框,方框覆蓋部分的圖片被自動截取下來,然后再在右側(cè)的多個容器里面重繪。

輸入寬高,自定義你需要訂制的頭像大小,目前只支持寬高相同的頭像圖片。

實現(xiàn)細節(jié)

因為你要對圖片所在的區(qū)域進行截圖,所以你得制作一張canvas,蓋在圖片所在的區(qū)域。這里,我們給出了一個函數(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ū)域肆意的操作了。首先,降整個區(qū)域畫上一個淺黑色的陰影,然后再擦除初始小方框區(qū)域里面的顏色。然后給整個頁面添加mousedown,mousemove,mouseup事件,他們所做的功能就跟你在頁面中實現(xià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');
    //移動小方框
    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;
    }                            
}

函數(shù)里面,你需要注意拖拽的邊界條件,一個是方框不能拖到圖片所在DOM外的邊界;另外一個就是當你鼠標放在小方框所在的區(qū)域改變鼠標的樣式。方框在拖動的過程中,我們不斷重繪方框移動的區(qū)域(也就是不斷的畫上陰影),然后在新的位置調(diào)用clearRect函數(shù),重新擦出一個小方框出來。在拖拽或是拉伸的過程中,我們會不斷調(diào)用produceSmallPic函數(shù),在右邊的容器(每個容器都是一個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);
        })
    }
}

我們說下這個函數(shù)的作用,這里我們要注意一個參數(shù)imageURL,這個URL是由圖片所在的DOM轉(zhuǎn)化來的。因為你要把DOM所在的區(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容器,講圖片重回到里面了,整個過程就這樣結(jié)束,回頭看來是不是很簡單。

相關(guān)依賴

<script src="https://cdn.bootcss.com/html2canvas/0.5.0-beta4/html2canvas.min.js"></script>

寫在最后

canvas的操作,要多多注意那些邊界條件,什么時候該重繪什么時候該清除,這些是比較重要的。邏輯清晰了,canvas本身的API也就那么幾個,操作起來也就沒那么麻煩了

到此這篇關(guān)于JS+Canvas實現(xiàn)自定義頭像功能的文章就介紹到這了,更多相關(guān)JS Canvas自定義頭像內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JS獲取瀏覽器版本及名稱實現(xiàn)函數(shù)

    JS獲取瀏覽器版本及名稱實現(xiàn)函數(shù)

    獲取瀏覽器名稱及版本信息,如果當前瀏覽器是IE,彈出瀏覽器版本,否則彈出當前瀏覽器名稱和版本,詳細實現(xiàn)代碼請參考本文
    2013-04-04
  • 基于bootstrap風(fēng)格的彈框插件

    基于bootstrap風(fēng)格的彈框插件

    這篇文章主要為大家詳細介紹了基于bootstrap風(fēng)格的彈框插件,適用于確認框、提示框,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • JS控制頁面跳轉(zhuǎn)時未請求要跳轉(zhuǎn)的地址怎么回事

    JS控制頁面跳轉(zhuǎn)時未請求要跳轉(zhuǎn)的地址怎么回事

    在js中通過window.location.href控制頁面跳轉(zhuǎn)時,有時會跳轉(zhuǎn)至緩存頁面,并沒有真正去請求要跳轉(zhuǎn)的地址,導(dǎo)致頁面數(shù)據(jù)未能及時加載刷新。怎么解決呢?下面小編給大家解答下
    2016-10-10
  • 微信小程序 動態(tài)修改頁面數(shù)據(jù)及參數(shù)傳遞過程詳解

    微信小程序 動態(tài)修改頁面數(shù)據(jù)及參數(shù)傳遞過程詳解

    這篇文章主要介紹了微信小程序 動態(tài)修改頁面數(shù)據(jù)及參數(shù)傳遞過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • 基于Cesium繪制柵欄的示例代碼

    基于Cesium繪制柵欄的示例代碼

    這篇文章主要介紹了如何利用Cesium繪制柵欄效果的示例代碼,文中的示例代碼講解詳細,對我們學(xué)習(xí)或工作有一定的幫助,需要的可以參考一下
    2022-06-06
  • 去除字符串左右兩邊的空格(實現(xiàn)代碼)

    去除字符串左右兩邊的空格(實現(xiàn)代碼)

    下面小編就為大家?guī)硪黄コ址笥覂蛇叺目崭?實現(xiàn)代碼)。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考
    2016-05-05
  • 使用axios實現(xiàn)上傳圖片進度條功能

    使用axios實現(xiàn)上傳圖片進度條功能

    Axios 是一個基于 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中。這篇文章主要介紹了使用axios實現(xiàn)上傳圖片進度條,需要的朋友可以參考下
    2017-12-12
  • JS實現(xiàn)移動端判斷上拉和下滑功能

    JS實現(xiàn)移動端判斷上拉和下滑功能

    通過手指觸屏,利用touchstart和touchend計算前后滑動距離,判斷是上拉還是下滑。接下來通過實例代碼給大家介紹js移動端判斷上拉和下滑功能,感興趣的朋友一起看看吧
    2017-08-08
  • javascript實現(xiàn)炫酷的拖動分頁

    javascript實現(xiàn)炫酷的拖動分頁

    非??岬膉avascript拖動分頁功能,無縫循環(huán)分頁,拖動鼠標即可完成分頁,鼠標向左拖動回到前一頁,向右拖動則翻開第二頁,還帶有動畫特效,著實很不錯,界面黑色,非主流風(fēng)格,相信很多人會喜歡的。
    2015-05-05
  • iScroll中事件點擊觸發(fā)兩次解決方案

    iScroll中事件點擊觸發(fā)兩次解決方案

    iScroll是我們在做手機網(wǎng)頁中常用的滑動控件之一。單說其功能已相當豐富。但個別時候也是會掉坑的,正好這次就遇上了。在android的app中嵌入網(wǎng)頁時不少手機會出現(xiàn)一次點擊兩次觸發(fā)的現(xiàn)象。經(jīng)過一段時間的折騰,總算想到了一個還算合理的解決放案。
    2015-03-03

最新評論

孝感市| 连南| 旅游| 正阳县| 伊春市| 聂荣县| 航空| 安龙县| 兰州市| 永济市| 社会| 西和县| 牡丹江市| 包头市| 辽源市| 澜沧| 阜南县| 集安市| 大理市| 灌阳县| 澎湖县| 彭阳县| 周口市| 新丰县| 晋中市| 绵阳市| 攀枝花市| 新兴县| 清水河县| 买车| 三明市| 确山县| 建宁县| 金溪县| 若尔盖县| 石楼县| 宝鸡市| 丹凤县| 涞水县| 泗洪县| 南汇区|