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

首頁 > 開發 > HTML5 > 正文

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

2024-09-05 07:22:09
字體:
來源:轉載
供稿:網友

寫在最前:

前兩天老大跟我說老虎官網上那個自定義頭像的功能是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容器,講圖片重回到里面了,整個過程就這樣結束,回頭看來是不是很簡單。

相關依賴:


復制代碼
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩亚洲国产一区| 欧美超级免费视 在线| 国产精品自产拍在线观| 亚洲第一偷拍网| 欧美视频二区36p| 日韩精品极品毛片系列视频| 欧美电影免费观看高清| 久久国产天堂福利天堂| 亚洲无av在线中文字幕| 日韩中文字幕国产精品| 另类视频在线观看| 韩国v欧美v日本v亚洲| 日韩一区二区福利| 正在播放亚洲1区| 欧美成人午夜影院| 亚洲欧美在线第一页| 欧美二区在线播放| 久久久精品影院| 精品视频一区在线视频| 色综合久久久888| 中文字幕亚洲欧美日韩在线不卡| 91欧美激情另类亚洲| 欧美极品少妇xxxxⅹ喷水| 中文字幕精品视频| 情事1991在线| 色小说视频一区| 欧美第一黄色网| 欧美成人一区二区三区电影| 全亚洲最色的网站在线观看| 九九久久国产精品| 国产精品久久久久av| 欧美激情国产日韩精品一区18| 欧美另类在线观看| 国产成人精彩在线视频九色| 欧美日韩激情视频| 97精品一区二区视频在线观看| 亚洲国产天堂久久国产91| 久久天天躁狠狠躁夜夜躁| 性欧美在线看片a免费观看| 国产综合在线看| 4k岛国日韩精品**专区| 91精品国产色综合久久不卡98| 亚洲男人天堂网站| 久久久久久综合网天天| 久久999免费视频| 国产精品专区第二| 国产精品你懂得| 性欧美视频videos6一9| 色综合天天综合网国产成人网| 精品中文字幕在线2019| 中日韩美女免费视频网址在线观看| 国产精品一区二区三区在线播放| 久久久中文字幕| 亚洲最大的av网站| 亚洲精品www久久久久久广东| 欧美老女人bb| 国产欧美一区二区三区在线看| 日本伊人精品一区二区三区介绍| 欧美久久精品午夜青青大伊人| 亚洲国产精彩中文乱码av| 亚洲精品免费在线视频| 欧美精品久久一区二区| 久久久国产精品x99av| 国产精品一久久香蕉国产线看观看| 欧美xxxx做受欧美.88| 国产精品福利久久久| 黄色精品一区二区| 欧洲午夜精品久久久| 亚洲韩国欧洲国产日产av| 久久理论片午夜琪琪电影网| 欧美精品videofree1080p| 欧美日韩福利在线观看| 中文字幕自拍vr一区二区三区| 欧美激情精品久久久久| 91黄色8090| 日韩美女激情视频| 成人做爽爽免费视频| 亚洲欧洲美洲在线综合| 精品视频中文字幕| 亚洲a∨日韩av高清在线观看| 国产精品亚洲第一区| 国产在线拍揄自揄视频不卡99| 成人xvideos免费视频| 色综合久久天天综线观看| 国产一区二区丝袜| 亚洲成在人线av| 欧美日韩国产色视频| 午夜剧场成人观在线视频免费观看| 欧美激情在线视频二区| 欧美成人精品在线观看| www.美女亚洲精品| 亚洲男女性事视频| 日韩精品久久久久久久玫瑰园| 福利一区视频在线观看| 热久久免费国产视频| 日本精品久久久久久久| 日韩精品在线免费观看| 欧美大全免费观看电视剧大泉洋| 久久影视电视剧免费网站清宫辞电视| 久久久久久国产精品| 亚洲欧美一区二区三区在线| 欧美在线www| 欧美精品videos| 欧美大片免费观看在线观看网站推荐| 在线a欧美视频| 色777狠狠综合秋免鲁丝| 日本久久中文字幕| 亚洲精品色婷婷福利天堂| 欧美成人午夜免费视在线看片| 欧美一区在线直播| 欧美日韩美女在线观看| 久久九九国产精品怡红院| 日日狠狠久久偷偷四色综合免费| 2020久久国产精品| 91精品中文在线| 国产精品偷伦免费视频观看的| 国产成人精品视频在线观看| 中文日韩电影网站| 日韩视频免费中文字幕| 国产精品日韩欧美综合| 欧美激情视频三区| 欧美成人合集magnet| 日本免费一区二区三区视频观看| 精品国产福利在线| 5566日本婷婷色中文字幕97| 精品久久久一区| 国产亚洲日本欧美韩国| 久久艳片www.17c.com| 精品国产91乱高清在线观看| 色777狠狠综合秋免鲁丝| 久久久久久久久中文字幕| 午夜精品久久久久久99热软件| 51精品国产黑色丝袜高跟鞋| 亚洲黄色片网站| 欧美激情女人20p| 色老头一区二区三区| 亚洲欧美国产一区二区三区| 欧美午夜丰满在线18影院| 亚洲天天在线日亚洲洲精| 欧美激情视频在线| 亚洲最新av在线| 日本一本a高清免费不卡| 国产精品美腿一区在线看| 日本一区二区三区四区视频| 国内精品久久久久影院 日本资源| 亚洲国产小视频在线观看| 亚洲国产成人久久综合一区| 欧美激情一区二区三级高清视频| 日韩一二三在线视频播| 国产免费久久av| 最近中文字幕mv在线一区二区三区四区| 日韩在线观看高清| 国产精品高潮视频| 精品久久久久久久久中文字幕| 少妇高潮久久77777| 亚洲成av人乱码色午夜| 亚洲欧美综合另类中字| 欧美精品免费在线| 成人黄色短视频在线观看| 伊人男人综合视频网| 久久精品国产v日韩v亚洲| 亚洲欧美国产精品久久久久久久| 日韩激情av在线播放| 国产丝袜高跟一区|