自制调色小工具给图片加滤镜,修改图片红、绿、蓝通道及亮度,修改图片颜色

上篇:

 

上篇我们给地图添加了锐化、模糊等滤镜,这篇来写一个小工具给图片调色。

调色比锐化等滤镜要简单许多,直接拿到像素值修改即可。不需要用到卷积核。。。(*^▽^*)

核心原理就是图像结构,使用context.getImageData获取图像像素结构。

const imageData = context.getImageData(0, 0, canvas.width, canvas.height);

图像数据的存储结构,每个像素占用 4 个连续的数组元素,分别表示该像素的红、绿、蓝和透明度(Alpha)值。具体结构如下:

[ R, G, B, A, R, G, B, A, R, G, B, A, ... ]

假设我们有一个 2x2 像素的图像,其像素颜色如下:

  • (0, 0): 红色 (255, 0, 0, 255)
  • (1, 0): 绿色 (0, 255, 0, 255)
  • (0, 1): 蓝色 (0, 0, 255, 255)
  • (1, 1): 白色 (255, 255, 255, 255)

每个像素占用 4 个连续的数组元素,分别表示该像素的红、绿、蓝和透明度(Alpha)值。具体结构如下:

[ 255, 0, 0, 255, 0, 255, 0, 255, 0, 0, 255, 255, 255, 255, 255, 255 ]

调整颜色只需要遍历图像数组,改对应的值就好。比如修改亮度,就是把数组中所有的红绿蓝颜色的值都加上滑块的值,数值越接近255越白,就显得图片越亮。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>简单图片调色</title>
    <style>
        #canvas {
            border: 1px solid black;
        }
    </style>
</head>

<body>
    <canvas id="canvas" width="300" height="300"></canvas>
    <br>
    <label for="brightness">亮度:</label>
    <input type="range" id="brightness" min="-100" max="100" value="0">
    <br>
    <label for="redInput">红:</label>
    <input type="range" id="redInput" min="-100" max="100" value="0">
    <br>
    <label for="redInput">绿:</label>
    <input type="range" id="greenInput" min="-100" max="100" value="0">
    <br>
    <label for="redInput">蓝:</label>
    <input type="range" id="blueInput" min="-100" max="100" value="0">
    <script>
        // 获取 Canvas 和上下文
        const canvas = document.getElementById('canvas');
        const context = canvas.getContext('2d');

        // 加载图像
        const img = new Image();
        img.crossOrigin = 'anonymous'; // 允许跨域加载图像
        img.src = 'https://t7.baidu.com/it/u=2604797219,1573897854&fm=193&f=GIF'; // 替换为你的图像路径
        img.onload = function () {
            context.drawImage(img, 0, 0, canvas.width, canvas.height);
        };

        // 调整亮度函数
        function adjustBrightness(context, brightness) {
            const imageData = context.getImageData(0, 0, canvas.width, canvas.height);
            const data = imageData.data;

            for (let i = 0; i < data.length; i += 4) {
                data[i] = data[i] + brightness;     // Red
                data[i + 1] = data[i + 1] + brightness; // Green
                data[i + 2] = data[i + 2] + brightness; // Blue
            }

            context.putImageData(imageData, 0, 0);
        }
        // 调整红通道函数
        function redChannel(context, brightness) {
            const imageData = context.getImageData(0, 0, canvas.width, canvas.height);
            const data = imageData.data;

            for (let i = 0; i < data.length; i += 4) {
                data[i] = data[i] + brightness;     // Red
            }

            context.putImageData(imageData, 0, 0);
        }
        // 调整绿通道函数
        function greenChannel(context, brightness) {
            const imageData = context.getImageData(0, 0, canvas.width, canvas.height);
            const data = imageData.data;

            for (let i = 0; i < data.length; i += 4) {
                data[i + 1] = data[i + 1] + brightness; // Green
            }

            context.putImageData(imageData, 0, 0);
        }
        // 调整蓝通道函数
        function blueChannel(context, brightness) {
            const imageData = context.getImageData(0, 0, canvas.width, canvas.height);
            const data = imageData.data;

            for (let i = 0; i < data.length; i += 4) {
                data[i + 2] = data[i + 2] + brightness; // Blue
            }

            context.putImageData(imageData, 0, 0);
        }
        // 监听亮度滑块变化
        const brightnessInput = document.getElementById('brightness');
        brightnessInput.addEventListener('input', function () {
            // 先重绘原始图像
            context.drawImage(img, 0, 0, canvas.width, canvas.height);
            // 调整亮度
            adjustBrightness(context, parseInt(brightnessInput.value, 10));
        });

        // 监听红通道滑块变化
        const redInput = document.getElementById('redInput');
        redInput.addEventListener('input', function () {
            // 先重绘原始图像
            context.drawImage(img, 0, 0, canvas.width, canvas.height);
            // 调整亮度
            redChannel(context, parseInt(redInput.value, 10));
        });

        // 监听绿通道滑块变化
        const greenInput = document.getElementById('greenInput');
        greenInput.addEventListener('input', function () {
            // 先重绘原始图像
            context.drawImage(img, 0, 0, canvas.width, canvas.height);
            // 调整亮度
            greenChannel(context, parseInt(greenInput.value, 10));
        });

        // 监听蓝通道滑块变化
        const blueInput = document.getElementById('blueInput');
        blueInput.addEventListener('input', function () {
            // 先重绘原始图像
            context.drawImage(img, 0, 0, canvas.width, canvas.height);
            // 调整亮度
            blueChannel(context, parseInt(blueInput.value, 10));
        });
    </script>
</body>

</html>

相关推荐

  1. Android 修改状态栏电池图标颜色

    2024-06-19 00:56:02       38 阅读
  2. GIMP中修改图片DPI

    2024-06-19 00:56:02       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-19 00:56:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-19 00:56:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-19 00:56:02       82 阅读
  4. Python语言-面向对象

    2024-06-19 00:56:02       91 阅读

热门阅读

  1. 网络流量轮廓

    2024-06-19 00:56:02       23 阅读
  2. 2024年安卓开发书籍推荐,含答案解析

    2024-06-19 00:56:02       27 阅读
  3. 2024.6.18.exercise

    2024-06-19 00:56:02       32 阅读
  4. 实际项目中如何实现分库分表

    2024-06-19 00:56:02       32 阅读
  5. 【前端面经】数组算法题解

    2024-06-19 00:56:02       34 阅读