您好,登錄后才能下訂單哦!
這篇文章主要介紹了Canvas如何實現微信紅包照片效果,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
微信紅包照片效果圖一張模糊圖片,只有魚哥小圓圈的區域是清晰可見
原理分析:
1、先在頁面放置一張原圖片image,用css3的filter做模糊處理
2、在圖片區域上方放置一個與圖片image大小一樣的canvas,放置整張清晰圖片
3、通過canvas的圖片剪輯方法,剪輯出一個圓圈區域,就達到了只顯示一個圓圈區域的效果
代碼及解析
目錄結構:
>
index.html,blur.js,blur.css
index.htm頁面代碼
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="height=device-height,width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/> <title>模糊紅包效果</title> <link rel="stylesheet" href="css/blur.css" rel="external nofollow" /> <script type="text/javascript" src="js/jquery-2.1.0.js"></script> </head> <body> <div id="blur-div"> <img id="blur-image" src="img/gd.jpg" /> <canvas id="canvas"></canvas><!--大小要在js設置,不要在css設置--> <a href="javascript:reset()" rel="external nofollow" class="button" id="reset-button">重置</a> <a href="javascript:show()" rel="external nofollow" class="button" id="show-button">顯示</a> </div> <script type="text/javascript" src="js/blur.js"></script> </body> </html>
css代碼blur.css
*{ margin:0px; padding: 0px; } #blur-div{ width:350px; height:220px; margin:0 auto; position: relative; overflow: hidden; } .button{ display: block; position: absolute; z-index: 200;/*按鈕在最上面*/ width: 60px; height: 30px; color: white; text-decoration: none; text-align: center; line-height: 30px; border-radius: 2px; } #reset-button{ left: 40px; bottom: 20px; background-color: #058; } #reset-button:hover{ background-color: #047; } #show-button{ right: 40px; bottom: 20px; background-color: #085; } #show-button:hover{ background-color: #074; } #canvas{ display:block; margin:0 auto; position: absolute; left:0px; top:0px; /*canvas在image之上,在按鈕下,z-index大于image,小于btn*/ z-index: 100; } #blur-image{ display:block; width:350px; height:220px; margin:0 auto; /*模糊效果*/ filter:blur(20px); -webkit-filter: blur(20px); -moz-filter:blur(20px); -ms-filter: blur(20px); -o-filter:blur(20px); position: absolute; left:0px; top:0px; z-index: 0; }
設置canvas大小要和image大小一樣
javascript代碼,方法將分片段進行講解:
初始化一些參數
var canvasWidth = window.innerWidth; //最外層div寬=窗口寬高,為了適應 var canvasHeight = window.innerHeight; var canvas = document.getElementById("canvas");//獲取到canvas元素對象 var context = canvas.getContext("2d");//獲取2d context //設置canvas大小和最外層div寬高一樣 canvas.width = canvasWidth; canvas.height = canvasHeight; //用canvas顯示清晰圖像 var image = new Image(); image.src = "img/gd.jpg"; //剪輯區域 var radius = 30;//剪輯區域圓的半徑 var clippingRegion;//剪輯區域對象
底層圖片用css3設置過后就已經可以顯示在頁面上,是一張模糊過的圖片,下一步就是在canvas上繪制剪輯圖片
image.onload = function(e) { //此處js代碼設置blur-div 和canvas寬高調整 $('#blur-div').css("width", canvasWidth + "px"); $('#blur-div').css("height", canvasHeight + "px"); $('#blur-image').css("width", image.width + "px");//因為圖像大小變化,所以重新設置 $('#blur-image').css("height", image.height + "px"); initCanvas();//這是初始化canvas的方法 }
function initCanvas() { //重置剪輯區域,歸位,隨機 clippingRegion = { //保證剪輯區域一定在有圖像的地方 x: Math.random() * (canvas.width - 2 * radius) + radius, y: Math.random() * (canvas.height - 2 * radius) + radius, r: radius }; draw(image, clippingRegion);//這是繪制image的方法 }
//設置剪輯區域 function setClippingRegion(clippingRegion) { context.beginPath(); //創建路徑 context.arc(clippingRegion.x, clippingRegion.y, clippingRegion.r, 0, Math.PI * 2, false); //畫圓形 context.clip(); }
function draw(image, clippingRegion) { context.clearRect(0, 0, canvas.width, canvas.height); context.save(); //圖像繪制前,確定剪輯區域 setClippingRegion(clippingRegion); context.drawImage(image, 0, 0); context.restore(); }
點擊顯示按鈕show,完全顯示清晰圖像,復用draw函數,將剪輯區域變大
function show() { //添加動畫 var theAnimation = setInterval(function() { clippingRegion.r += 20; //慢慢擴大顯示 //邊界條件 if (clippingRegion.r > 2 * Math.max(canvas.width, canvas.height)) { //停止動畫,否則函數執行不停止 clearInterval(theAnimation); } draw(image, clippingRegion);//循環執行draw方法,慢慢將剪輯區域的半徑擴大,實現動畫效果 }, 30);//bug,顯示之后立即點擊重置,還是會打開圖片,可能是因為定時器還沒結束 }
重置則再次初始化canvas就行了,在initCanvas已經做了隨機位置,所以每次點擊重置都是隨機位置的剪輯區域
//重置,initCanvas function reset() { initCanvas(); }
完整blur.js代碼
var canvasWidth = window.innerWidth; //最外層div寬=窗口寬高,為了適應 var canvasHeight = window.innerHeight; var canvas = document.getElementById("canvas"); var context = canvas.getContext("2d"); //設置canvas大小和最外層div寬高一樣 canvas.width = canvasWidth; canvas.height = canvasHeight; //用canvas顯示清晰圖像 var image = new Image(); var radius = 30; //剪輯區域 var clippingRegion; image.src = "img/gd.jpg"; //因為圖像加載需要時間,所以用onload方法,等待圖片加載完成后再執行函數 image.onload = function(e) { //blur-div 和canvas寬高調整 $('#blur-div').css("width", canvasWidth + "px"); $('#blur-div').css("height", canvasHeight + "px"); $('#blur-image').css("width", image.width + "px"); $('#blur-image').css("height", image.height + "px"); initCanvas(); } function initCanvas() { //重置剪輯區域,歸位,隨機 clippingRegion = { //保證剪輯區域一定在有圖像的地方 x: Math.random() * (canvas.width - 2 * radius) + radius, //30-320 0-width 減掉半徑30 350-30*2 y: Math.random() * (canvas.height - 2 * radius) + radius, //30-190 0-height 減掉半徑30 220-30*2 r: radius }; draw(image, clippingRegion); } //設置剪輯區域 function setClippingRegion(clippingRegion) { context.beginPath(); //創建路徑 context.arc(clippingRegion.x, clippingRegion.y, clippingRegion.r, 0, Math.PI * 2, false); //畫圓形 context.clip(); } function draw(image, clippingRegion) { context.clearRect(0, 0, canvas.width, canvas.height); context.save(); //圖像繪制前,確定剪輯區域 setClippingRegion(clippingRegion); context.drawImage(image, 0, 0); //圖片大于canvas context.restore(); } //完全顯示清晰圖像,復用draw函數,將剪輯區域變大 function show() { //添加動畫,此函數有缺點 clippingRegion.r=radius;//給半徑歸位 var theAnimation = setInterval(function() { console.log("anima"); clippingRegion.r += 20; //慢慢擴大顯示 //邊界條件 if (clippingRegion.r > 2 * Math.max(canvas.width, canvas.height)) { //停止動畫,否則函數執行不停止1000 clearInterval(theAnimation); } draw(image, clippingRegion); }, 30); } //重置,initCanvas function reset() { initCanvas(); }
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Canvas如何實現微信紅包照片效果”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。