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

方法一:

  • 原理:

使用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.mfbz.cn/a/496213.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

量子通信达新高度!两大诺奖技术联手,铸就前所未有的高效纠缠光子源

滑铁卢大学量子计算研究所&#xff08;IQC&#xff09;的科学家们成功地融合了两项诺贝尔奖级别的研究成果&#xff0c;从而在量子通信领域取得了重大进展。他们现在能够通过量子点技术高效生成几乎完美的纠缠光子对&#xff0c;这一突破性成果已在《通信物理学》&#xff08;C…

实例:NX二次开发求取封闭曲线的面积(多个封闭曲线)

一、概述 最近在NX二次开发群里有人推了一篇关于写求取封闭曲线面积的文章。针对小白的我决定试着做一做&#xff0c;期间遇到了很多问题&#xff0c;全部用NXOpenC通过录制代码进行修改&#xff0c;最后发现老是有问题&#xff0c;后来通过ufun转化解决了问题&#xff0c;个人…

如何使用在项目中使用echarts

一、使用echarts的好处和作用 ECharts 是一个强大的数据可视化库&#xff0c;主要用于在网页上创建丰富多彩的交互式图表和地图。一些 ECharts 的好处和作用包括&#xff1a; 好处&#xff1a; 丰富的图表类型&#xff1a;ECharts 提供了各种常见的图表类型&#xff0c;如折线…

python的一些知识点

在C C Java中&#xff0c;基本数据类型变量&#xff08;将常量数据存储在变量空间当中&#xff09; int a 3; int b 4; 在C C中&#xff0c;指针变量&#xff08;存储的是变量的物理内存地址&#xff09; int a 3; int* b; b &a; int** c; c &b; printf("%d&…

jira安装与配置

1. 环境准备 环境要求 1) JDK1.8以上环境配置 2) Mysql数据库5.7.13 3) Jira版本7及破解包 1.1 JDK1.8安装配置 1) 首先下载 JDK1.8&#xff0c; - 网址&#xff1a;https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html - windows64 版&am…

Vue3气泡卡片(Popover)

效果如下图&#xff1a;在线预览 APIs 参数说明类型默认值必传title卡片标题string | slot‘’falsecontent卡片内容string | slot‘’falsemaxWidth卡片内容最大宽度string | number‘auto’falsetrigger卡片触发方式‘hover’ | ‘click’‘hover’falseoverlayStyle卡片样式…

开源AI引擎:利用影像处理与目标检测技术对违章建筑排查

一、项目案例介绍 随着城市化进程的加快&#xff0c;城市规划和管理工作面临着前所未有的挑战&#xff0c;违章建筑的排查与处理成为了城市管理中的一项重要任务。传统的违章建筑排查方法依赖于人力巡查&#xff0c;效率低下且难以全面覆盖。为了解决这一问题&#xff0c;现代…

C++资产设备管理系统

一、引言 1.1 项目设计背景及意义 1.1.1理论研究基础 &#xff08;1&#xff09;C在C的基础上增加了面向对象的机制。 &#xff08;2&#xff09;充分利用面向对象机制中的多态性实现函数的设计。 1.1.2 技术层面的支持 运用系统为C面向对象程序设计提供的各种设计方法和V…

DAZ Studio中常用的快捷键组合

CtrlAlt左键: 旋转视图CtrlAlt右键: 平移视图CtrlF: 在Mac上对应AppleF,聚焦选中的物体Alt方向键: 平移视图CtrlP: 返回透视视图W/A/S/D: 上/下/左/右视图ShiftF11: 在Mac上可能需要添加Option键,全屏模式F3: 启用X射线视见效果Ctrl1到0: 切换各种渲染式样CtrlL: 切换场景灯光 …

Midjourney辞典AIGC中英双语图文辞典+Midjourney提示关键词

完整内容下载&#xff1a;https://download.csdn.net/download/u010564801/89042077 完整内容下载&#xff1a;https://download.csdn.net/download/u010564801/89042077 完整内容下载&#xff1a;https://download.csdn.net/download/u010564801/89042077

基于Java在线考试系统系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

element表格 加滚动,监听底部实现分页加载

表格要实现滚动很简单&#xff0c;给他加一个高度即可 height"300" 然后是监听事件 mounted() {this.lazyLoading();}, methods:{lazyLoading(){let dom document.querySelector(".el-table__body-wrapper");dom.addEventListener("scroll", (…

适合工业应用,MAX42408AFOA、MAX42408AFOB、MAX42410AFOA采用小解决方案尺寸的高功率DC/DC转换器

产品简介 MAX42408/MAX42410均为高度集成的同步降压转换器&#xff0c;具有内部高侧和低侧开关。这些IC均可在4.5V至36V的输入电压范围内提供高达8A/10A的电流。电压质量可以通过PGOOD信号来监测。MAX42408/MAX42410可以在压差模式下以99%的占空比运行&#xff0c;非常适合工业…

创业最大的机会是什么?2024普通人的机会!2024创业新风口!2024轻资产创业!2024年做什么行业赚钱有前景?

开封王婆的爆火就是商机的展现&#xff01;她就是敏锐的发现了婚恋市场上的空白点&#xff0c;看到了年轻人对真实、自由恋爱关系的渴望&#xff0c;以及对情感生活自主性和独立性的追求。并且除了人力几乎没有没有任何成本。而且&#xff0c;这种创业模式几乎只需要人力投入&a…

纯前端网页播放20路海康威视、大华RTSP视频流,调用双显卡GPU加速

关于网页播放摄像头RTSP视频流&#xff0c;网上有很多免费开源方案&#xff0c;大多数是通过把在服务器端RTSP转码成HLS或者RTMP等前端可以播放的视频流&#xff0c;然后推到前端播放&#xff0c;但是大多数延迟非常高&#xff08;比如&#xff1a;HLS延迟达到十几秒&#xff0…

Springboot实现qq邮件的发送

一、打开必要的邮件设置 首先登录qq邮箱官网登录之后&#xff0c;在设置中将传输协议给打开&#xff0c;我们需要用这个秘钥作为发件人的邮箱授权。 这里开启之后&#xff0c;记住这个秘钥。 二、代码编写 首先我们将作为发送邮件的账户信息写入配置文件。 spring:mail:hos…

#include<初见C语言之指针(5)>

目录 一、sizeof和strlen的对比 1. sizeof 2.strlen 二、数组和指针题解析 1. ⼀维数组 1.1数组名理解 2.字符数组 3. ⼆维数组 三、指针运算题解析 总结 一、sizeof和strlen的对比 1. sizeof 我们前面介绍过sizeof是单目操作符 sizeof括号中有表达式&#xff0c;不…

力扣19 链表 删除倒数N结点

目录 问题&#xff1a; 1.链表的组成结构 2.如何改变倒数第N个结点 2.1 求链表长度 2.2 找到倒数第N个结点前一个结点 2.3 让倒数N前一个改变即可 3.源代码示范 问题&#xff1a; 1.链表的组成结构 单向链表 由value next 组成 &#xff0c;value包括此结点的各基础属…

【虹科干货】长文预警!使用ntopng和NetFlow/IPFIX检测Dos攻击(上)

为了和大家探讨网络安全领域中的关键问题&#xff0c;我将分两期来展示如何使用ntopng和NetFlow/IPFIX检测Dos攻击。在本篇中&#xff0c;我先简单介绍网络安全面临的挑战、为何网络流量分析在应对网络安全挑战中起重要作用&#xff0c;此外&#xff0c;我会介绍在此次检测中使…

【机器学习】代价函数

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…
最新文章