canvas 实现图片局部模糊_HTML5 Canvas图片马赛克模糊动画
本文作者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图片马赛克模糊动画相关推荐
- 小程序canvas放大模糊_HTML5 Canvas图像效果应用程序–添加模糊
小程序canvas放大模糊 HTML5 Canvas Image Effects App – Adding Blur. Today we continue HTML5 canvas examples, ...
- java canvas添加图片上传_HTML5 canvas画图及图片上传服务器
上一个教程中我们实现了使用html5 canvas来制作涂鸦画板的效果,在这个教程中,我们将讲解如何将画好的图片上传到服务器上. 最后的效果如下图,当点击"开始画图"按钮,将在ca ...
- 网页设计图片向上浮动_HTML5 背景图片漂浮/浮动特效
JavaScript 语言: JaveScriptBabelCoffeeScript 确定 if (typeof fac == "undefined") fac = functio ...
- canvas 实现图片局部模糊_JavaScript中的图片处理与合成(四)
引言: 本系列现在构思成以下4个部分: 基础类型图片处理技术之缩放.裁剪与旋转(传送门): 基础类型图片处理技术之图片合成(传送门): 基础类型图片处理技术之文字合成(传送门): 算法类型图片处理技术 ...
- HTML5 Canvas图片马赛克模糊动画
经常可以在网上或者电视上看到被马赛克模糊的图片或者视频,今天我们要利用HTML5 Canvas技术来实现图片的马赛克模糊效果.在演示中我们可以拖动滑竿来设置马赛克模糊的程度,你可以在不同的值下观察图片 ...
- 使用canvas截图网页为图片并解决跨域空白以及模糊问题
使用canvas截图网页为图片并解决跨域空白以及模糊问题 参考文章: (1)使用canvas截图网页为图片并解决跨域空白以及模糊问题 (2)https://www.cnblogs.com/bububu ...
- js 图片打碎_html5 canvas打碎的图片玻璃碎片特效
特效描述:html5canvas 打碎的图片 玻璃碎片特效.玻璃碎片特效 代码结构 1. 引入JS 2. HTML代码 var imageWidth = 768, imageHeight = 485; ...
- 小猿圈web前端简述canvas如何实现二维码和图片合成
你经常看到活动海报什么的,上都是有各种宣传文案以及二维码形成的,你知道怎么用canvas实现二维码和图片合成,下面小猿圈Linux讲师为你详细介绍一下canvas如何实现二维码和图片合成的. 使用ur ...
- uni保存canvas图片_小程序canvas【开箱即用】
前言 小程序canvas有多坑,相信开发过的同学们都深有体会 每一次写使用canvas都忍不住骂两句 鉴于此,小弟就从0开始,一步一步实现画图功能,并且列明所有我遇到的坑 注意:本文都是基于uni开发 ...
最新文章
- android 绘画,Android绘图基础
- 飞书在线文档 美誉度国内最佳!一起来围观~
- mysql 按月自动建表
- 关于一部分数学知识》(工具向)(实时更新)
- 3.将maven项目jar纳入maven仓库,Mave项目依赖另外一个Maven项目的案例
- 基于触发机制的脚本系统
- 21世纪的设计模式:适配器模式
- ubuntu14.04下安装cudnn5.1.3,opencv3.0,编译caffe及配置matlab和python接口过程记录
- Windows MongoDB安装配置
- python 去除字典列表中的重复字典
- mt4 指标 涨跌幅 颜色k线_通达信K线波段操盘指标公式
- 面向消息的持久通信与面向流的通信
- 一加手机高德位置服务器,高德地图在线导航悬浮窗闪亮一加手机
- JavaScript之---嵌入JS代码
- kinit 某个账户,提示 Clients credentials have been revoked
- ct与x光的哪个辐射大_X光和CT,哪个辐射大?这些数字,医生可能并没告诉你
- 农业动物相关数据集与算法——调研整理
- 与【孤尽】老师交流总结
- 使用 VMware Server 在 Oracle Enterprise Linux 上安装 Oracle RAC 10g
- unity3d:百度语音在线语音转文字,文字转语音,跨平台