canvas+javascript实现点击更改图片中指定部位的颜色(将近似的颜色值变更为自定义的颜色)

news2024/11/25 5:02:05

在这里插入图片描述
原图:
在这里插入图片描述

完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <canvas></canvas>
</body>
<script>
    const cvs = document.querySelector("canvas");
    const ctx = cvs.getContext("2d", {
        willReadFrequently: true
    });
    let originalImageData; // 用于存储原始图像数据
    

    function init(){
        const img = new Image();
        img.src = './img.png';
        img.onload = () => {
            cvs.width = img.width;
            cvs.height = img.height;
            ctx.drawImage(img, 0, 0);
            // 在加载图像后保存原始图像数据
            originalImageData = ctx.getImageData(0, 0, cvs.width, cvs.height);
        }
    }
    init();
    cvs.addEventListener('click', e=>{
        // console.log(e)
        const x = e.offsetX;
        const y = e.offsetY;
        if (!originalImageData) {
            console.error("原始图像数据未初始化!");
            return;
        }
         // 恢复原始图像数据
        ctx.putImageData(originalImageData, 0, 0);
        // 取出点击位置的像素点颜色
        const imgData = ctx.getImageData(0, 0, cvs.width, cvs.height);
        const clickColor = getColor(x, y, imgData);
        const greenColor = [0, 255, 0, 255];

        const stack = [{ x, y }];
        while (stack.length > 0) {
            const { x, y } = stack.pop();
            
            if (x < 0 || x >= cvs.width || y < 0 || y >= cvs.height) {
                continue;
            }
            
            const i = point2Index(x, y);
            const color = getColor(x, y, imgData);
            
            if (diff(color, clickColor) <= 100 && diff(color, greenColor) !== 0) {
                imgData.data.set(greenColor, i);
                
                stack.push({ x: x + 1, y });
                stack.push({ x: x - 1, y });
                stack.push({ x, y: y + 1 });
                stack.push({ x, y: y - 1 });
            }
        }
        ctx.putImageData(imgData, 0, 0);
        
    })
    function point2Index(x, y){
        return ( y * cvs.width + x ) * 4;
    }
    function getColor(x, y, imageData){
        const i = point2Index(x, y);
        return [
            imageData.data[i],
            imageData.data[i+1],
            imageData.data[i+2],
            imageData.data[i+3],
        ];
    }
    function diff(color1, color2){
        const res = Math.abs(color1[0] - color2[0]) +
            Math.abs(color1[1] - color2[1]) + 
            Math.abs(color1[2] - color2[2]) + 
            Math.abs(color1[3] - color2[3]);
        return res;
    }
</script>
</html>

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

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

相关文章

前端架构师之02_ES6_高级

1 类和继承 1.1 class类 JavaScript 语言中&#xff0c;生成实例对象的传统方法是通过构造函数。 // ES5 创建对象 // 创建一个类&#xff0c;用户名 密码 function User(name,pass){// 添加属性this.name name;this.pass pass; } // 用 原型 添加方法 User.prototype.sho…

跨境电商如何利用海外代理IP,提高竞争力?

随着经济全球化的深度发展&#xff0c;跨境电商已经成为外贸发展的主要赛道&#xff0c;跨境电商王者般的新业态&#xff0c;近年来&#xff0c;我国跨境电商发展得到政府的大力扶持。而代理IP也逐渐成为助力跨境业务的强大工具之一。可以为我们跨境电商种出现的如地域限制、安…

中秋国庆,双节同乐

中秋国庆双节将至&#xff0c;送上最诚挚的祝福&#xff1a; 愿你的中秋月圆&#xff0c;家庭团圆更圆满&#xff0c;幸福围绕&#xff0c;笑声不断。 愿国庆日祖国繁荣昌盛&#xff0c;人民幸福安康&#xff0c;和谐美好永恒。 让我们共同庆祝这个特殊的时刻&#xff0c;祝福您…

MDETR:端到端多模态理解的调制检测

代码&#xff1a;https://github.com/ashkamath/mdetr 摘要 多模态推理系统依靠预训练的目标检测器从图像中提取感兴趣的区域。然而&#xff0c;这个关键模块通常用作黑匣子&#xff0c;独立于下游任务进行训练&#xff0c;并使用固定的对象和属性词汇表。这使得此类系统难以捕…

【数据仓库设计基础(三)】数据集市

文章目录 一. 数据集市的概念二. 数据集市与数据仓库的区别三. 数据集市设计 一. 数据集市的概念 数据集市是数据仓库的一种简单形式&#xff0c;通常由组织内的业务部门自己建立和控制。一个数据集市面向单一主题域&#xff0c;如销售、财务、市场等。 数据集市的数据源可以是…

Lucene-MergePolicy详解

简介 该文章基于业务需求背景&#xff0c;因场景需求进行参数调优&#xff0c;下文会尽可能针对段合并策略&#xff08;SegmentMergePolicy&#xff09;的全参数进行说明。 主要介绍TieredMergePolicy&#xff0c;它是Lucene4以后的默认段的合并策略&#xff0c;之前采用的合并…

网络时钟程序Net_Clock

网络时钟程序Net_Clock 小程序的源代码,着重编程思想,巧妙的构思架构... 主要功能:简单的Socket网络套接从时间服务器获取时间,timeSetEvent精度定时器,颜色方案,自绘标题栏,自绘菜单...等等 VS2015平台的精度时钟程序,北京,美东,美中三个时区日期时间显示,多种颜色方案显示…

深入理解常见应用级算法思想

1 概论 1.1 概念 1.1.1 数据结构 1&#xff09;概述 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。 2&#xff09;划分 从关注的维度…

洗文案神器,不同洗文案神器怎么选择

在数字时代&#xff0c;文字的重要性变得愈发突出&#xff0c;不论是在商业领域的广告宣传、自媒体的文章创作&#xff0c;还是学术界的研究论文&#xff0c;文字都是传递信息和思想的关键媒介。然而&#xff0c;创作高质量的文案并非易事&#xff0c;这就是为什么越来越多的人…

FFmpeg安装教程

一、下载安装 打开官方网站&#xff0c;ffmpeg管网地址&#xff0c;点击左侧download或页面中的绿色Download按钮。 选择要下载的平台&#xff0c;windows版本选择红框第一个&#xff0c;第二个是github平台 点击左侧release builds&#xff0c;选择要下载的软件版本&#x…

【STM32】sct 分散加载文件的格式与应用

简介 当工程按默认配置构建时&#xff0c;MDK 会根据我们选择的芯片型号&#xff0c;获知芯片的内部FLASH 及内部 SRAM 存储器概况&#xff0c;自动生成一个以工程名命名的后缀为*.sct 的分散加载文件(Linker Control File&#xff0c;scatter loading)&#xff0c;链接器根据…

巨人互动|Google海外户Google SEO工作为何要把控细节

Google SEO&#xff08;搜索引擎优化&#xff09;是一项为了提高网站在Google搜索结果中的排名和可见性的策略和技术。在进行SEO工作时&#xff0c;把控细节非常重要&#xff0c;本文小编讲讲关于为何要把控细节的原因。 巨人互动|Google海外户&Google内容定位介绍&#xf…

当当网商品详情数据接口

当当网商品详情数据接口可以通过当当网的开放平台获取相关信息。您可以注册当当开放平台账号&#xff0c;并按照要求提交申请获取API接口的调用凭证。获得授权后&#xff0c;您将会收到一组AccessKey和SecretKey。使用编程语言&#xff08;如Java&#xff09;调用API接口&#…

聊一聊JDK21-虚拟线程

目录 前言 Virtual Threads的开始 为什么需要Virtual Threads JDK19 预览版初次出现 JDK21 Virtual Threads的正式发布 Virtual Threads 该怎么使用 简单聊聊Virtual Threads的实现 使用时候的注意事项 本地尝鲜一下JDK21及Virtual Threads 结语 前言 2023年9月19日…

26272-2010 地面数字电视调谐器基本性能要求和测量方法.

声明 本文是学习GB-T 26272-2010 地面数字电视调谐器基本性能要求和测量方法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了地面数字电视接收设备用特高频/超高频(VHF/UHF) 电子式调谐器基本性能要求 和测量方法。 本标准适用…

数据结构与算法(C语言版)P8---树、二叉树、森林

【本节目标】 树概念及结构。二叉树概念及结构。二叉树常见OJ题练习。 1、树概念及结构 1.1、树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树&#xf…

再看dockerfile指令用法:80分钟一口气学完docker+k8s!带你掌握docker+k8s所有核心知识点,全程干货,无废话!

dockerfile实践 需求&#xff1a;通过dockerfile&#xff0c;构建nginx镜像&#xff0c;且容器运行后&#xff0c;生成的页面显示“书季&#xff0c;要攒劲哦~” #1、穿件dockerfile,注意文件名必须是这个。 [rootHadoop2 learn_docker]# cat dockerfile FROM nginx RUN echo…

linux opensuse使用mtk烧录工具flashtool

环境 linux发行版&#xff1a;opensuse leap 15.5 工具&#xff1a;SP_Flash_Tool_Selector_exe_Linux_v1.2316.00.100.rar 或其他版本 目标&#xff1a;mtk设备 下载链接 https://download.csdn.net/download/zmlovelx/88382784 或网络搜索。 使用 opensuse可直接解压后使…

HOMER7配置告警

概述 HOMER是一款100%开源的针对SIP/VOIP/RTC的抓包工具和监控工具。 HOMER是一款强大的、运营商级、可扩展的数据包和事件捕获系统&#xff0c;是基于HEP/EEP协议的VoIP/RTC监控应用程序&#xff0c;并可以使用即时搜索、处理和存储大量的信令、RTC事件、日志和统计信息。 …

【数据仓库设计基础(二)】维度数据模型

文章目录 一. 概述二. 维度数据模型建模过程三. 维度规范化四. 维度数据模型的特点五. 维度数据模型1. 星型模式1.1&#xff0e;事实表1.2&#xff0e;维度表1.3&#xff0e;优点1.4&#xff0e;缺点1.5&#xff0e;示例 2. 雪花模式2.1&#xff0e;数据规范化与存储2.2&#x…