Table of Content
            
                
  
            
        
        
        
        前几天微信红包照片着实火了一把,很多人也已经发现可以通过抓包获取到原始图片,而其背后的实现方式也引起了一些朋友的兴趣。
所以今天我们一起实现一个简单的微信红包照片效果。
首先,根据标题你已经知道我们要使用 HTML5 和 CSS3 来实现。那么新建一个 HTML5 文件吧。
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <meta name="description" content="Blur">
        <meta name="keywords" content="Blur">
        <title>Blur</title>
        <script src="jquery-2.2.0.min.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
    </body>
</html>
接下来,准备一张图片(img.jpg),例如:

并在 body 部分加入一张图片。
<body>
    <div id="blur-div">
        <img id="blur-image" src="img.jpg" alt="blur image">
    </div>
</body>
然后,准备一个 blur.css 文件:
#blur-div {
    width: 350px;
    height: 389px;
    margin: 0 auto;
    position: relative;
}
#blur-image {
    width: 350px;
    height: 389px;
    margin: 0 auto;
    display: block;
    filter: blur(20px);
    -webkit-filter: blur(20px);
    -o-filter: blur(20px);
    -moz-filter: blur(20px);
    -ms-filter: blur(20px);
    position: absolute;
    left: 0px;
    top: 0px;
    z-index: 0;
}
在 HTML 中链接 CSS:
    <link href="blur.css" rel="stylesheet" type="text/css"/>
</head>
看一下效果,已经可以显示一个模糊效果的图片了。紧接着要实现的,是那个不模糊的圆。我的思路是,在模糊的图片前面覆盖一张原始图片,通过剪切原始图片使其只保留一个圆形部分。
在前面的 blur-div 中补充一个 Canvas 画布:
<div id="blur-div">
    <img id="blur-image" src="img.jpg" alt="blur image">
    <canvas id="canvas"></canvas>
</div>
为画布设置 CSS,为圆形部分添加一个阴影:
#canvas {
    margin: 0 auto;
    position: absolute;
    left: 0px;
    top: 0px;
    z-index: 100;
    display: block;
    filter: drop-shadow(0px 0px 5px #E2E1E0);
    -webkit-filter: drop-shadow(0px 0px 5px #E2E1E0);
    -o-filter: drop-shadow(0px 0px 5px #E2E1E0);
    -moz-filter: drop-shadow(0px 0px 5px #E2E1E0);
    -ms-filter: drop-shadow(0px 0px 5px #E2E1E0);
}
现在,设置画布内容,开始剪切。我们新建一个 blur.js 文件:
var canvas = document.getElementById("canvas")
var context = canvas.getContext("2d")
canvas.width = 350
canvas.height = 389
function initCanvas() {
    draw(img, {x: 160, y: 280, r: 50})
}
function draw(image, clip) {
    context.clearRect(0, 0, canvas.width, canvas.height)
    context.save()
    context.beginPath()
    context.arc(clip.x, clip.y, clip.r, 0, Math.PI * 2)
    context.clip()
    context.drawImage(image, 0, 0)
    context.restore()
}
var img = new Image()
img.src = "img.jpg"
img.onload = function () {
    initCanvas()
}
别忘了在 HTML 中加入这个 JS 文件:
<script src="blur.js" charset="utf-8"></script>
现在,一个微信红包的模糊效果就实现了,关于适配和优化的部分就不多说了。

 李二狗 — @Meniny
                李二狗 — @Meniny
             
            
             
                 
                