• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com专业计算机教程网站
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure
您的位置:首页 > 网页设计 >html5 > HTML5实现一个图片滤镜效果的示例代码分享

HTML5实现一个图片滤镜效果的示例代码分享

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-03

本文主要包含HTML5,图片滤镜等相关知识,匿名希望在学习及工作中可以帮助到您
http:///wiki/1118.html" target="_blank">HTML5实现一个图片滤镜效果的示例代码分享
html页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width = device-width,initial-scale=1.0">
</head>
<body>
<img src="img/5.jpg" class="photo">
</br>
</br>
<button class="reset">复位</button>
</br>
</br>
<button class="grayscale">灰度效果</button>
<button class="sepia">复古效果</button>
<button class="redmask">红色蒙版效果</button>
<button class="brightness">亮度效果</button>
<button class="invert">反转效果</button>
<button class="blackWhite">黑白效果</button>
<button class="emboss">浮雕效果</button>
</br>
</br>
<button class="redFilter">红色滤镜</button>
<button class="greenFilter">绿色滤镜</button>
<button class="blueFilter">蓝色滤镜</button>
<button class="yellowFilter">黄色滤镜</button>
<button class="perpleFilter">紫色滤镜</button>
<button class="cyanFilter">青色滤镜</button>
 
 
<script src="js/photoFilter.js"></script>
<script src="js/app.js"></script>
</body>
</html>

app.js代码:

/**
 * Created by syo on 2017/3/14.
 * @author syo QQ:23371891
 */
 
let photoData = new PhotoFilter(document.querySelector('.photo'));
 
Array.prototype.slice.call(document.querySelectorAll('button')).map(function (dom, index) {
    dom.onclick = function (evt) {
        switch (evt.target.className) {
            case 'grayscale':
                photoData.grayscale();
                break;
            case 'sepia':
                photoData.sepia();
                break;
            case 'redmask':
                photoData.redmask();
                break;
            case 'brightness':
                photoData.brightness(20);
                break;
            case 'invert':
                photoData.invert();
                break;
            case 'blackWhite':
                photoData.blackWhite(100);
                break;
            case 'emboss':
                photoData.emboss();
                break;
            case 'redFilter':
                photoData.redFilter();
                break;
            case 'greenFilter':
                photoData.greenFilter();
                break;
            case 'blueFilter':
                photoData.blueFilter();
                break;
            case 'yellowFilter':
                photoData.yellowFilter();
                break;
            case 'perpleFilter':
                photoData.perpleFilter();
                break;
            case 'cyanFilter':
                photoData.cyanFilter();
                break;
            case 'reset':
                photoData.reset();
                break;
        }
    }
})

photoFilter.js 类:

/**
 * Created by syo on 2017/3/14.
 * @author syo QQ:23371891
 * 图片滤镜效果
 * class PhotoFilter
 * @param img 传入img元素
 */
 
class PhotoFilter {
    constructor(img) {
        "http://blog.51cto.com/viewpic.php?refimg=" + this.src = img.src;
        this.img = img;
        this.canvas = document.createElement('canvas');
        this.ctx = this.canvas.getContext('2d');
        this.canvas.width = this.img.width;
        this.canvas.height = this.img.height;
        this.drawImage();
    }
 
    /**
     * 初始化
     * 图片转canvas
     */
    drawImage() {
        this.ctx.drawImage(this.img, 0, 0);
        this.imgData = this.ctx.getImageData(0, 0, this.canvas.width, this.canvas.height);
    }
 
    /**
     * 灰度
     * 红、绿、蓝三个像素值的算术平均值
     */
    grayscale() {
        let d = this.imgData.data;
        for (let i = 0; i < d.length; i += 4) {
            let r = d[i];
            let g = d[i + 1];
            let b = d[i + 2];
            d[i] = d[i + 1] = d[i + 2] = (r + g + b) / 3;
        }
        this.canvasToImage();
    }
 
    /**
     * 复古
     * 将红、绿、蓝三个像素,分别取这三个值的某种加权平均值,使得图像有一种古旧的效果。
     */
    sepia() {
        let d = this.imgData.data;
        //假定d[i]是像素数组中一个象素的红色值,则d[i+1]为绿色值,d[i+2]为蓝色值,d[i+3]就是alpha通道值
        for (let i = 0; i < d.length; i += 4) {
            let r = d[i];
            let g = d[i + 1];
            let b = d[i + 2];
            d[i] = (r * 0.393) + (g * 0.769) + (b * 0.189);    //red
            d[i + 1] = (r * 0.349) + (g * 0.686) + (b * 0.168); //green
            d[i + 2] = (r * 0.272) + (g * 0.534) + (b * 0.131); //blue
        }
        this.canvasToImage();
    }
 
    /**
     * 红色蒙版
     * 图像呈现一种偏红的效果
     * 算法是将红色通道设为红、绿、蓝三个值的平均值,而将绿色通道和蓝色通道都设为0
     */
    redmask() {
        let d = this.imgData.data;
        for (let i = 0; i < d.length; i += 4) {
            let r = d[i];
            let g = d[i + 1];
            let b = d[i + 2];
            d[i] = (r + g + b) / 3;
            d[i + 1] = d[i + 2] = 0;
        }
        this.canvasToImage();
    }
 
    /**
     * 亮度
     * 图像变得更亮或更暗
     * 算法将红色通道、绿色通道、蓝色通道,同时加上一个正值或负值
     * @param val 亮度值
     */
    brightness(val) {
        let d = this.imgData.data;
        for (let i = 0; i < d.length; i += 4) {
            d[i] += val;
            d[i + 1] += val;
            d[i + 2] += val;
        }
        this.canvasToImage();
    }
 
 
    /**
     * 反相
     * 图片呈现一种色彩颠倒的效果
     * 算法为红、绿、蓝通道都取各自的相反值(255-原值)
     */
    invert() {
        let d = this.imgData.data;
        for (let i = 0; i < d.length; i += 4) {
            d[i] = 255 - d[i];
            d[i + 1] = 255 - d[i + 1];
            d[i + 2] = 255 - d[i + 2];
        }
        this.canvasToImage();
    }
 
    /**
     * 黑白图片
     * 求RGB平均值Avg = (R + G + B) / 3,如果Avg >= 100,则新的颜色值为R=G=B=255;
     * @param Threshold 阈值
     */
    blackWhite(threshold) {
        let d = this.imgData.data;
        for (let i = 0; i < d.length; i += 4) {
            let avg = (d[i] + d[i + 1] + d[i + 2]) / 3;
            d[i] = d[i + 1] = d[i + 2] = avg > threshold ? 255 : 0;
        }
        this.canvasToImage();
    }
 
    /**
     * 浮雕效果
     * 当前RGB减去相邻的GRB得到的值再加上128
     * 取平均值 再次灰度,优化浮雕的效果
     */
    emboss() {
        let d = this.imgData.data;
        for (let i = 4; i < d.length; i += 4) {
            d[i] = d[i] - d[i + 4] + 128;
            d[i + 1] = d[i + 1] - d[i + 5] + 128;
            d[i + 2] = d[i + 2] - d[i + 6] + 128;
            let avg = (d[i] + d[i + 1] + d[i + 2]) / 3;
            d[i] = avg;
            d[i + 1] = avg;
            d[i + 2] = avg;
        }
        this.canvasToImage();
    }
 
    /**
     * 红色滤镜
     * 当前红色通道值变为原来的2倍
     */
    redFilter() {
        let d = this.imgData.data;
        for (let i = 4; i < d.length; i += 4) {
            let r = d[i] * 2;
            d[i] = r > 255 ? 255 : r;
        }
   
  


 

您可能想查找下面的文章:

  • HTML5知识点总结
  • HTML5的本地存储
  • HTML5本地存储之IndexedDB
  • Html5实现文件异步上传功能
  • Html5新标签datalist实现输入框与后台数据库数据的动态匹配
  • 详解HTML5 window.postMessage与跨域
  • HTML5拖放API实现拖放排序的实例代码
  • 解决html5中video标签无法播放mp4问题的办法
  • HTML5新特性 多线程(Worker SharedWorker)
  • Html5新增标签有哪些

相关文章

  • 2018-12-03HTML5实现简单图片上传所遇到的问题及解决办法 _html5教程技巧
  • 2017-08-06HTML5对手机页面长按会粘贴复制禁用的解决方法
  • 2018-12-03h5头像图片旋转css3精确控制每个图片的位置
  • 2018-12-03HTML5的发展
  • 2018-12-03H5的之sse服务器发送事件EventSource详解
  • 2017-08-06HTML5中的Scoped属性使用实例
  • 2018-12-03HTML5边玩边学(2)基础绘图实现方法_html5教程技巧
  • 2018-12-03html5实现一个简单的多人飞机游戏实例详解
  • 2018-12-03详解H5非常重要的28个新特性,新技巧和新技术
  • 2017-10-05h5音频视频播放

文章分类

  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure

最近更新的内容

    • svg path路径的作用:svg path在网页开发中的使用方法
    • html5 web本地存储将取代我们的cookie_html5教程技巧
    • html5生成柱状图(条形图)效果的实例代码
    • HTML5应用:离线的应用以及存储的应用
    • 会走动的图形html5时钟示例
    • jQuery Validation的使用详解
    • 如何通过html和css完成下拉菜单的制作?
    • 【HTML5】Canvas绘制简单图片教程
    • html5中新特性之语义化标签的实例分析
    • 安全攻防入门教程:10个安全攻防零基础入门教程推荐

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有