0

0

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

黄舟

黄舟

发布时间:2017-03-25 15:17:43

|

3766人浏览过

|

来源于php中文网

原创

html5实现一个图片滤镜效果的示例代码分享
html页面:




    
    Title
    


@@##@@






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 类:

ImgCreator AI
ImgCreator AI

一款AI图像生成工具,适合创建插图、动画和概念设计图像。

下载
/**
 * 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;
        }
        this.canvasToImage();
    }
 
    /**
     * 绿色滤镜
     * 当前绿色通道值变为原来的2倍
     */
    greenFilter() {
        let d = this.imgData.data;
        for (let i = 4; i < d.length; i += 4) {
            let g = d[i + 1] * 2;
            d[i + 1] = g > 255 ? 255 : g;
        }
        this.canvasToImage();
    }
 
    /**
     * 蓝色滤镜
     * 当前蓝色通道值变为原来的2倍
     */
    blueFilter() {
        let d = this.imgData.data;
        for (let i = 4; i < d.length; i += 4) {
            let b = d[i + 2] * 2;
            d[i + 2] = b > 255 ? 255 : b;
        }
        this.canvasToImage();
    }
 
    /**
     * 黄色滤镜
     * 当前红色通道和绿色通道值+50
     */
    yellowFilter() {
        let d = this.imgData.data;
        for (let i = 4; i < d.length; i += 4) {
            let r = d[i] + 50;
            let g = d[i + 1] + 50;
            d[i] = r > 255 ? 255 : r;
            d[i + 1] = g > 255 ? 255 : g;
        }
        this.canvasToImage();
    }
 
    /**
     * 紫色滤镜
     * 当前红色通道和蓝色通道值+50
     */
    perpleFilter() {
        let d = this.imgData.data;
        for (let i = 4; i < d.length; i += 4) {
            let r = d[i] + 50;
            let b = d[i + 2] + 50;
            d[i] = r > 255 ? 255 : r;
            d[i + 2] = b > 255 ? 255 : b;
        }
        this.canvasToImage();
    }
 
    /**
     * 青色滤镜
     * 当前蓝色通道和绿色通道值+50
     */
    cyanFilter() {
        let d = this.imgData.data;
        for (let i = 4; i < d.length; i += 4) {
            let g = d[i + 1] + 50;
            let b = d[i + 2] + 50;
            d[i + 1] = g > 255 ? 255 : g;
            d[i + 2] = b > 255 ? 255 : b;
        }
        this.canvasToImage();
    }
 
    /**
     * canvas转换成图片元素
     */
    canvasToImage() {
        this.ctx.putImageData(this.imgData, 0, 0);
        this.img.src = this.canvas.toDataURL();
    }
 
    /**
     * 复原
     */
    reset() {
        this.img.src = "http://blog.51cto.com/viewpic.php?refimg=" + this.src;
        this.drawImage();
    }
}
HTML5实现一个图片滤镜效果的示例代码分享

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

3

2026.01.12

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

97

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

53

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

139

2026.01.09

学python网站汇总
学python网站汇总

本专题整合了学python网站汇总,阅读专题下面的文章了解更多详细内容。

12

2026.01.09

python学习网站
python学习网站

本专题整合了python学习相关推荐汇总,阅读专题下面的文章了解更多详细内容。

19

2026.01.09

俄罗斯手机浏览器地址汇总
俄罗斯手机浏览器地址汇总

汇总俄罗斯Yandex手机浏览器官方网址入口,涵盖国际版与俄语版,适配移动端访问,一键直达搜索、地图、新闻等核心服务。

84

2026.01.09

漫蛙稳定版地址大全
漫蛙稳定版地址大全

漫蛙稳定版地址大全汇总最新可用入口,包含漫蛙manwa漫画防走失官网链接,确保用户随时畅读海量正版漫画资源,建议收藏备用,避免因域名变动无法访问。

432

2026.01.09

php学习网站大全
php学习网站大全

精选多个优质PHP入门学习网站,涵盖教程、实战与文档,适合零基础到进阶开发者,助你高效掌握PHP编程。

49

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 6.6万人学习

HTML+CSS基础与实战
HTML+CSS基础与实战

共132课时 | 9.4万人学习

前端开发(基础+实战项目合集)
前端开发(基础+实战项目合集)

共60课时 | 3.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号