js改变图片曝光度(高亮度)

news2024/11/15 23:31:55

方法一:

  • 原理:

使用canvas进行滤镜操作,通过改变图片数据每个像素点的RGB值来提高图片亮度。

  • 缺点

当前项目使用的是svg,而不是canvas

调整出来的效果不是很好,图片不是高亮,而是有些发白

  • 效果

  • 代码
<body>
  高亮:<input type="range" id="exposureRange" min="-50" max="50" value="0"><span id="exposureValueBox">0</span>
  <br>
  <input type="file" id="fileInput" accept="image/*">
  <canvas id="canvas"></canvas>

  <script>
    const exposureRange = document.getElementById('exposureRange');
    const fileInput = document.getElementById('fileInput');
    const exposureValueBox = document.getElementById('exposureValueBox');
    const canvas = document.getElementById('canvas');
    const ctx = canvas.getContext('2d');
    let originalImageData;
    let exposureValue;

    exposureRange.addEventListener('input', function (event) {
      exposureValue = parseInt(exposureRange.value);
      exposureValueBox.innerHTML = exposureValue
      highlightImage(exposureValue);
    });

    fileInput.addEventListener('change', function (event) {
      var file = event.target.files[0];
      var reader = new FileReader();
      reader.onload = function (event) {
        var img = new Image();
        img.onload = function () {
          canvas.width = img.width;
          canvas.height = img.height;
          ctx.drawImage(img, 0, 0);
          originalImageData = img;
        }
        img.src = event.target.result;
      }
      reader.readAsDataURL(file);
    });

    function highlightImage(brightnessValue = 0) {
      const img = originalImageData.cloneNode(); // 使用原始图像的副本
      const imgCanvas = document.createElement('canvas');
      const imgCtx = imgCanvas.getContext('2d');
      imgCanvas.width = img.width;
      imgCanvas.height = img.height;
      imgCtx.drawImage(img, 0, 0);
      const imageData = imgCtx.getImageData(0, 0, imgCanvas.width, imgCanvas.height);
      const data = imageData.data;
      for (let i = 0; i < data.length; i += 4) {
        data[i] = clamp(data[i] + brightnessValue, 0, 255); // Red channel
        data[i + 1] = clamp(data[i + 1] + brightnessValue, 0, 255); // Green channel
        data[i + 2] = clamp(data[i + 2] + brightnessValue, 0, 255); // Blue channel
      }
      imgCtx.putImageData(imageData, 0, 0);
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      ctx.drawImage(imgCanvas, 0, 0);
    }

    function clamp(value, min, max) {
      return Math.min(Math.max(value, min), max);
    }
  </script>
</body>

方法二:

  • 原理

通过使用svg滤镜feColorMatrix(基于转换矩阵对颜色进行变换,每—像素的颜色值都经过矩阵计算出新颜色),改变图片每个像素的颜色值来提高图片亮度。

  • 优点

当前代码使用svg渲染图片,操作对象也是svg;

准确的提高图片亮度,而不是给图片加白;

  • 效果

  • 代码
<body>
    <input type="range" id="brightnessRange" min="0" max="2000" value="1000">
    <br>
    <svg id="svgCanvas" width="450" height="300">
      <!-- filter:定义一个svg滤镜容器 id:用于标识滤镜 -->
      <filter id="brightnessFilter">
        <!-- feColorMatrix:svg滤镜类型 -->
        <feColorMatrix type="matrix" values="1 0 0 0 0
                                              0 1 0 0 0
                                              0 0 1 0 0
                                              0 0 0 1 0"/>
      </filter>
      <image id="image" width="450" height="300" xlink:href="laohu.png" filter="url(#brightnessFilter)"></image>
    </svg>
    
    <script>
        const brightnessRange = document.getElementById('brightnessRange');
        const image = document.getElementById('image');
        const filter = document.getElementById('brightnessFilter');

        brightnessRange.addEventListener('input', adjustBrightness);

        function adjustBrightness() {
            const brightnessValue = parseFloat(brightnessRange.value);
            applyBrightnessAdjustment(brightnessValue);
        }

        function applyBrightnessAdjustment(brightnessValue) {
            const matrixValues = [
                brightnessValue / 100, 0, 0, 0, 0,
                0, brightnessValue / 100, 0, 0, 0,
                0, 0, brightnessValue / 100, 0, 0,
                0, 0, 0, 1, 0
            ];
            filter.querySelector('feColorMatrix').setAttribute('values', matrixValues.join(' '));
        }
    </script>
</body>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1551581.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OC对象 - Block解决循环引用

文章目录 OC对象 - Block解决循环引用前言1. 循环引用示例1.1 分析 2. 解决思路3. ARC下3.1 __weak3.2 __unsafe_unretained3.3 __block 4. MRC下4.1 __unsafe_unretain....4.1 __block 5. 总结5.1 ARC下5.2 MRC下 OC对象 - Block解决循环引用 前言 本章将会通过一个循环引用…

GitHub如何验证2FA,烦人的认证,看完几分钟解锁

序言 今天需要使用GitHub&#xff0c;还是不能用&#xff0c;需要2FA认证&#xff0c;没办法&#xff0c;还是让2FA认证流程来&#xff0c;一一解决&#xff0c;在解决这认证问题之前&#xff0c;先说说2FA认证是什么&#xff1f; 什么是2FA 2FA 是指两步验证&#xff08;Two…

用搜索引擎收集信息-常用方式

1&#xff0c;site csdn.net &#xff08;下图表示只在csdn网站里搜索java&#xff09; 2&#xff0c;filetype:pdf &#xff08;表示只检索某pdf文件类型&#xff09; 表示在浏览器里面查找有关java的pdf文件 3&#xff0c;intitle:花花 &#xff08;表示搜索网页标题里面有花…

【小尘送书-第十五期】Excel函数与公式应用大全for Excel 365 Excel

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

python--初学函数

函数&#xff08;function&#xff09;&#xff1a; 什么是函数&#xff1f; 具有名称的&#xff0c;是为了解决某一问题&#xff0c;功能代码的集合&#xff0c;叫做函数 python中函数如何定义&#xff1a;def>define function定义函数 def function_name([args临时变量…

【QA】MySQL多表查询详解

文章目录 前言关系型数据库中数据表之间的关系数据准备数据内容表间关系 基础查询 | 全部查询多表查询分类1 | 连接查询内连接外连接 | 左外连接外连接 | 右外连接自连接 | 自连接自连接 | 联合查询 分类2 | 子查询返回结果分类 | 标量子查询返回结果分类 | 列子查询返回结果分…

linux centos7中使用 Postfix 和Dovecot搭建邮件系统

作者主页&#xff1a;点击&#xff01; Linux专栏&#xff1a;点击&#xff01; Postfix Postfix是一个开源的邮件传输代理&#xff08;MTA&#xff09;&#xff0c;用于路由和传送电子邮件。它是一个可靠、安全且高性能的邮件服务器软件&#xff0c;常用于搭建邮件系统的核心…

redis简介及常用命令

一、关系数据库与非关系型数据库 1.1、关系型数据库 一个结构化的数据库&#xff0c;创建在关系模型基础上一般面向于记录包括&#xff1a;Oracle、MySQL、SQL Server、Microsoft Access、DB2等以上数据库在使用的时候必须先建库建表设计表结构&#xff0c;然后存储数据的时候…

centos7系统下nginx1.24.0升级

如果没有这些目录&#xff0c;请先创建: mkdir /data/software mkdir /data/program提前下载所需的软件&#xff1a; cd /data/software wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz wget https://nginx.org/download/nginx-1.24.0.tar.gz安装nginx cd /data/soft…

AM5SE系列微机保护装置在临沂奥体中心配电工程中的应用

摘 要&#xff1a;目前&#xff0c;微机保护装置广泛应用于电力系统中&#xff0c;该类装置能够有效监测电力系统的运行状况&#xff0c;并实时记录电力系统出现故障的位置及性质&#xff0c;从而为故障的快速处理提供有效的参考信息。本文介绍的AM5SE系列微机保护装置可以针对…

PCL点云处理之M估计样本一致性(MSAC)平面拟合(二百三十六)

PCL点云处理之M估计样本一致性(MSAC)平面拟合(二百三十五六) 一、算法介绍二、使用步骤1.代码2.效果一、算法介绍 写论文当然用RANSAC的优化变种算法MSAC啊,RANSAC太土太LOW了哈哈 MSAC算法(M-estimator Sample Consensus)是RANSAC(Random Sample Consensus)的一种…

【华大 HC32L110】调用`printf`和串口接收中断的冲突问题解决

华大单片机 HC32L110调用printf和串口接收中断的冲突问题解决,经过查找是官方库 去使能了 串口的接收功能,记录解决问题的过程 目录 1.硬件MCU资料2. printf和串口接收中断的冲突解决3.重新封装 fputc 函数4.查找问题,发现是官方库配置有误5. 查找寄存器手册,修改寄存器配置…

Discord账号多开如何做?有什么办法可以同时在线?

Discord 是一款免费的语音和文本聊天应用程序。它是一个游戏聊天应用程序和社区&#xff0c;最初是游戏的语音和IM服务&#xff0c;然后转向直播&#xff0c;然后是游戏商店的社区平台。它成为游戏玩家在游戏中交流和协作的首选工具。下面将为你介绍如何同时使用多个discord账号…

Linux文件(系统)IO(含动静态库的链接操作)

文章目录 Linux文件&#xff08;系统&#xff09;IO&#xff08;含动静态库的链接操作&#xff09;1、C语言文件IO操作2、三个数据流stdin、stdout、stderr3、系统文件IO3.1、相关系统调用接口的使用3.2、文件描述符fd3.3、文件描述符的分配规则3.3、重定向3.4、自制shell加入重…

【JavaEE】初识线程,线程与进程的区别

文章目录 ✍线程是什么&#xff1f;✍线程和进程的区别✍线程的创建1.继承 Thread 类2.实现Runnable接口3.匿名内部类4.匿名内部类创建 Runnable ⼦类对象5.lambda 表达式创建 Runnable ⼦类对象 ✍线程是什么&#xff1f; ⼀个线程就是⼀个 “执行流”. 每个线程之间都可以按…

Element-Plus下拉菜单边框去除教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

InputStream字节输入流和OutStream字节输出流

InputStream InputStream是Java标准库最基本的输入流&#xff0c;在java.io包内。它是一个抽象类。 FileInputStream&#xff1a;从文件中读取数据&#xff0c;是最终数据源。 int read()方法&#xff1a;读取输入流的下一个字节&#xff0c;并返回字节表示的int值&#xff08;…

什么是Prompt Tuning?

本文是观看视频What is Prompt Tuning?后的笔记。 大语言模型&#xff08;如ChatGPT &#xff09;是基础模型&#xff0c;是经过互联网上大量知识训练的大型可重用模型。 他们非常灵活&#xff0c;同样的模型可以分析法律文书或撰写文章。 但是&#xff0c;如果我们需要用其解…

C语言数据结构基础——排序

目录 1.插入排序 2.冒泡排序 3. 堆排序 4.希尔排序 5.直接选择排序 6.快速排序☆☆ 6.1快速排序基础 6.2关于快速排序的时间复杂度 6.3随机数法和三数取中法 6.4其他的单趟实现方法 6.4.1挖坑法 6.4.2前后指针版快速排序☆ 6.4.3非递归实现快排☆ 7.归并排序 7.1递归…

spark核心概念

DAG 所谓DAG就是有向无环图&#xff0c;其实就是个无环的流程&#xff0c;Spark的核心是根据RDD来实现的&#xff0c;Spark Scheduler!则为Spark核心实现的重要一环&#xff0c;其作用就是任务调度。Spark的任务调度就是如何组织任务去处理RDD中每个分区的数据&#xff0c;根据…