中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Canvas如何實現微信紅包照片效果

發布時間:2021-05-12 12:58:19 來源:億速云 閱讀:201 作者:小新 欄目:web開發

這篇文章主要介紹了Canvas如何實現微信紅包照片效果,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

微信紅包照片效果圖一張模糊圖片,只有魚哥小圓圈的區域是清晰可見

Canvas如何實現微信紅包照片效果

原理分析:

1、先在頁面放置一張原圖片image,用css3的filter做模糊處理
2、在圖片區域上方放置一個與圖片image大小一樣的canvas,放置整張清晰圖片
3、通過canvas的圖片剪輯方法,剪輯出一個圓圈區域,就達到了只顯示一個圓圈區域的效果

代碼及解析

目錄結構:

>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如何實現微信紅包照片效果”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

隆化县| 安陆市| 信阳市| 宁强县| 融水| 西盟| 阳东县| 灵武市| 武陟县| 无极县| 华容县| 库尔勒市| 佛冈县| 阳曲县| 海宁市| 庆阳市| 西青区| 行唐县| 嘉定区| 开化县| 黑龙江省| 修武县| 平原县| 双桥区| 晋宁县| 错那县| 筠连县| 巴林左旗| 黄浦区| 武邑县| 波密县| 宣恩县| 呼玛县| 元阳县| 长沙县| 长阳| 亚东县| 威海市| 林芝县| 安吉县| 忻城县|