本文作者html5tricks,转载请注明出处

经常可以在网上或者电视上看到被马赛克模糊的图片或者视频,今天我们要利用

HTML代码如下

Change pixel resolution 32

定义了一个滑竿和3张待模糊的图片。

JavaScript代码如下

/*!

* Close Pixelate v2.0.00 beta

* http://desandro.com/resources/close-pixelate/

*

* Developed by

* - David DeSandro http://desandro.com

* - John Schulz http://twitter.com/jfsiii

*

* Licensed under MIT license

*/

/*jshint asi: true, browser: true, eqeqeq: true, forin: false, immed: false, newcap: true, noempty: true, strict: true, undef: true */

( function( window, undefined ) {

//

'use strict';

// util vars

var TWO_PI = Math.PI * 2

var QUARTER_PI = Math.PI * 0.25

// utility functions

function isArray( obj ) {

return Object.prototype.toString.call( obj ) === "[object Array]"

}

function isObject( obj ) {

return Object.prototype.toString.call( obj ) === "[object Object]"

}

var console = window.console

// check for canvas support

var canvas = document.createElement('canvas')

var isCanvasSupported = canvas.getContext && canvas.getContext('2d')

// don't proceed if canvas is no supported

if ( !isCanvasSupported ) {

return

}

function ClosePixelation( img, options ) {

this.img = img

// creat canvas

var canvas = this.canvas = document.createElement('canvas')

this.ctx = canvas.getContext('2d')

// copy attributes from img to canvas

canvas.className = img.className

canvas.id = img.id

this.render( options )

// replace image with canvas

img.parentNode.replaceChild( canvas, img )

}

ClosePixelation.prototype.render = function( options ) {

this.options = options

// set size

var w = this.width = this.canvas.width = this.img.width

var h = this.height = this.canvas.height = this.img.height

// draw image on canvas

this.ctx.drawImage( this.img, 0, 0 )

// get imageData

try {

this.imgData = this.ctx.getImageData( 0, 0, w, h ).data

} catch ( error ) {

if ( console ) {

console.error( error )

}

return

}

this.ctx.clearRect( 0, 0, w, h )

for ( var i=0, len = options.length; i < len; i++ ) {

this.renderClosePixels( options[i] )

}

}

ClosePixelation.prototype.renderClosePixels = function( opts ) {

var w = this.width

var h = this.height

var ctx = this.ctx

var imgData = this.imgData

// option defaults

var res = opts.resolution || 16

var size = opts.size || res

var alpha = opts.alpha || 1

var offset = opts.offset || 0

var offsetX = 0

var offsetY = 0

var cols = w / res + 1

var rows = h / res + 1

var halfSize = size / 2

var diamondSize = size / Math.SQRT2

var halfDiamondSize = diamondSize / 2

if ( isObject( offset ) ){

offsetX = offset.x || 0

offsetY = offset.y || 0

} else if ( isArray( offset) ){

offsetX = offset[0] || 0

offsetY = offset[1] || 0

} else {

offsetX = offsetY = offset

}

var row, col, x, y, pixelY, pixelX, pixelIndex, red, green, blue, pixelAlpha

for ( row = 0; row < rows; row++ ) {

y = ( row - 0.5 ) * res + offsetY

// normalize y so shapes around edges get color

pixelY = Math.max( Math.min( y, h-1), 0)

for ( col = 0; col < cols; col++ ) {

x = ( col - 0.5 ) * res + offsetX

// normalize y so shapes around edges get color

pixelX = Math.max( Math.min( x, w-1), 0)

pixelIndex = ( pixelX + pixelY * w ) * 4

red = imgData[ pixelIndex + 0 ]

green = imgData[ pixelIndex + 1 ]

blue = imgData[ pixelIndex + 2 ]

pixelAlpha = alpha * ( imgData[ pixelIndex + 3 ] / 255)

ctx.fillStyle = 'rgba(' + red +','+ green +','+ blue +','+ pixelAlpha + ')'

switch ( opts.shape ) {

case 'circle' :

ctx.beginPath()

ctx.arc ( x, y, halfSize, 0, TWO_PI, true )

ctx.fill()

ctx.closePath()

break

case 'diamond' :

ctx.save()

ctx.translate( x, y )

ctx.rotate( QUARTER_PI )

ctx.fillRect( -halfDiamondSize, -halfDiamondSize, diamondSize, diamondSize )

ctx.restore()

break

default :

// square

ctx.fillRect( x - halfSize, y - halfSize, size, size )

} // switch

} // col

} // row

}

// enable img.closePixelate

HTMLImageElement.prototype.closePixelate = function ( options ) {

return new ClosePixelation( this, options )

}

// put in global namespace

window.ClosePixelation = ClosePixelation

})( window );

以上这个JS文件是马赛克模糊效果的具体实现。

下面是页面上调用的JS代码:

var dolly1 = document.getElementById('dolly1')

var dolly2 = document.getElementById('dolly2')

var dolly3 = document.getElementById('dolly3')

var pixelOpts = [ { resolution: 8 } ]

var pixelDolly1 = dolly1.closePixelate( pixelOpts )

var pixelDolly2 = dolly2.closePixelate( pixelOpts )

var pixelDolly3 = dolly3.closePixelate( pixelOpts )

var range = document.getElementById('range')

var output = document.getElementById('output')

range.addEventListener( 'change', function( event ) {

var res = parseInt( event.target.value, 10 )

res = Math.floor( res / 2 ) * 2

res = Math.max( 4, Math.min( 100, res ) )

output.textContent = res

// console.log( res );

pixelOpts = [ { resolution: res } ]

pixelDolly1.render( pixelOpts )

pixelDolly2.render( pixelOpts )

pixelDolly3.render( pixelOpts )

}, false )

以上就是实现这款HTML5 Canvas图片马赛克模糊动画的全部过程。

canvas 实现图片局部模糊_HTML5 Canvas图片马赛克模糊动画相关推荐

  1. 小程序canvas放大模糊_HTML5 Canvas图像效果应用程序–添加模糊

    小程序canvas放大模糊 HTML5 Canvas Image Effects App – Adding Blur. Today we continue HTML5 canvas examples, ...

  2. java canvas添加图片上传_HTML5 canvas画图及图片上传服务器

    上一个教程中我们实现了使用html5 canvas来制作涂鸦画板的效果,在这个教程中,我们将讲解如何将画好的图片上传到服务器上. 最后的效果如下图,当点击"开始画图"按钮,将在ca ...

  3. 网页设计图片向上浮动_HTML5 背景图片漂浮/浮动特效

    JavaScript 语言: JaveScriptBabelCoffeeScript 确定 if (typeof fac == "undefined") fac = functio ...

  4. canvas 实现图片局部模糊_JavaScript中的图片处理与合成(四)

    引言: 本系列现在构思成以下4个部分: 基础类型图片处理技术之缩放.裁剪与旋转(传送门): 基础类型图片处理技术之图片合成(传送门): 基础类型图片处理技术之文字合成(传送门): 算法类型图片处理技术 ...

  5. HTML5 Canvas图片马赛克模糊动画

    经常可以在网上或者电视上看到被马赛克模糊的图片或者视频,今天我们要利用HTML5 Canvas技术来实现图片的马赛克模糊效果.在演示中我们可以拖动滑竿来设置马赛克模糊的程度,你可以在不同的值下观察图片 ...

  6. 使用canvas截图网页为图片并解决跨域空白以及模糊问题

    使用canvas截图网页为图片并解决跨域空白以及模糊问题 参考文章: (1)使用canvas截图网页为图片并解决跨域空白以及模糊问题 (2)https://www.cnblogs.com/bububu ...

  7. js 图片打碎_html5 canvas打碎的图片玻璃碎片特效

    特效描述:html5canvas 打碎的图片 玻璃碎片特效.玻璃碎片特效 代码结构 1. 引入JS 2. HTML代码 var imageWidth = 768, imageHeight = 485; ...

  8. 小猿圈web前端简述canvas如何实现二维码和图片合成

    你经常看到活动海报什么的,上都是有各种宣传文案以及二维码形成的,你知道怎么用canvas实现二维码和图片合成,下面小猿圈Linux讲师为你详细介绍一下canvas如何实现二维码和图片合成的. 使用ur ...

  9. uni保存canvas图片_小程序canvas【开箱即用】

    前言 小程序canvas有多坑,相信开发过的同学们都深有体会 每一次写使用canvas都忍不住骂两句 鉴于此,小弟就从0开始,一步一步实现画图功能,并且列明所有我遇到的坑 注意:本文都是基于uni开发 ...

最新文章

  1. android 绘画,Android绘图基础
  2. 飞书在线文档 美誉度国内最佳!一起来围观~
  3. mysql 按月自动建表
  4. 关于一部分数学知识》(工具向)(实时更新)
  5. 3.将maven项目jar纳入maven仓库,Mave项目依赖另外一个Maven项目的案例
  6. 基于触发机制的脚本系统
  7. 21世纪的设计模式:适配器模式
  8. ubuntu14.04下安装cudnn5.1.3,opencv3.0,编译caffe及配置matlab和python接口过程记录
  9. Windows MongoDB安装配置
  10. python 去除字典列表中的重复字典
  11. mt4 指标 涨跌幅 颜色k线_通达信K线波段操盘指标公式
  12. 面向消息的持久通信与面向流的通信
  13. 一加手机高德位置服务器,高德地图在线导航悬浮窗闪亮一加手机
  14. JavaScript之---嵌入JS代码
  15. kinit 某个账户,提示 Clients credentials have been revoked
  16. ct与x光的哪个辐射大_X光和CT,哪个辐射大?这些数字,医生可能并没告诉你
  17. 农业动物相关数据集与算法——调研整理
  18. 与【孤尽】老师交流总结
  19. 使用 VMware Server 在 Oracle Enterprise Linux 上安装 Oracle RAC 10g
  20. unity3d:百度语音在线语音转文字,文字转语音,跨平台

热门文章

  1. 大型软件开发中的流程与规范
  2. LabVIEW如何开发大型程序
  3. 看李佩甫的长篇小说《生命册》的感悟
  4. 路由器设置多WAN口要点技巧
  5. 纯音乐 -《抒情中国系列-烟雨江南》
  6. 系统异常SVC与PendSV指令及CM3 处理器内部寄存器分析
  7. Microsoft同步工具SyncToy
  8. java 叠加层_java简单设置图层实现图片叠加
  9. ISC技术分享:从RASP开启云上应用安全防护
  10. Web前端设计与开发课程设计:简易淘宝网页设计