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>

相关推荐

  1. 改变图片的 Python 实现算法

    2024-03-29 03:08:01       47 阅读
  2. 改变图片颜色

    2024-03-29 03:08:01       40 阅读

最近更新

  1. stm32实现IIC读写

    2024-03-29 03:08:01       0 阅读
  2. 中小企业和数智化的距离,只差一块华为IdeaHub

    2024-03-29 03:08:01       0 阅读
  3. C# —— Directory类

    2024-03-29 03:08:01       2 阅读
  4. 在Ubuntu 22.04上安装Docker最新版本

    2024-03-29 03:08:01       1 阅读

热门阅读

  1. 15届蓝桥杯备赛(3)

    2024-03-29 03:08:01       23 阅读
  2. 如何在Tomcat 9上部署前端和后端项目

    2024-03-29 03:08:01       25 阅读
  3. 题目 2833: 金币

    2024-03-29 03:08:01       20 阅读
  4. go | map、multiple returnvalues、variadic function、recursion

    2024-03-29 03:08:01       19 阅读
  5. 什么是jQuery?

    2024-03-29 03:08:01       18 阅读
  6. 全球变暖(dfs和bfs)

    2024-03-29 03:08:01       19 阅读
  7. 数据结构与算法-分治算法

    2024-03-29 03:08:01       18 阅读
  8. CAS中的ABA问题

    2024-03-29 03:08:01       18 阅读
  9. linux -- sysctl详解1

    2024-03-29 03:08:01       18 阅读
  10. 互联网摸鱼日报(2024-03-27)

    2024-03-29 03:08:01       23 阅读