C#操作像素替换图片中的指定颜色

  待处理的图片,其特征是包含有限数量颜色,不同的颜色相互交叉使用,相同颜色并未完全连贯,需要将图片中的指定颜色替换为另一颜色。虽然很多图片处理工具都支持类似操作,最后还是自己动手编写简单的处理程序。
  程序的功能主要包括:1)一对一颜色替换,仅替换颜色RGB值等于指定颜色的像素;2)范围替换,替换颜色RGB值与指定颜色相距不超过指定距离的像素。
  获取图片像素和设置图片像素使用的是Bitmap类的GetPixel和SetPixel函数,计算像素与像素的距离使用的是三维坐标距离计算公式,如下图所示(参考文献1)。

在这里插入图片描述
  关键代码如下所示:

Bitmap curImage = picSrcImage.Image as Bitmap;
Color curColor;

//源颜色,待替换颜色
Color colorSource = Color.FromArgb(Convert.ToByte(nudR.Value), Convert.ToByte(nudG.Value), Convert.ToByte(nudB.Value));
//目标颜色
Color colorDest = Color.FromArgb(Convert.ToByte(nudDR.Value), Convert.ToByte(nudDG.Value), Convert.ToByte(nudDB.Value));

//一对一替换像素
for (int i = 0; i < curImage.Width; i++)
{
    for (int j = 0; j < curImage.Height; j++)
    {
        curColor = curImage.GetPixel(i, j);
        if ((curColor.R == Convert.ToByte(nudR.Value)) &&
            (curColor.G == Convert.ToByte(nudG.Value)) &&
            (curColor.B == Convert.ToByte(nudB.Value)))
        {
            curImage.SetPixel(i, j, colorDest);
        }
    }
}

//范围替换像素
for (int i = 0; i < curImage.Width; i++)
{
    for (int j = 0; j < curImage.Height; j++)
    {
        curColor = curImage.GetPixel(i, j);
        if (CalculateDistance(curColor, colorSource) <= Convert.ToDouble(nudRange.Value))
        {
            curImage.SetPixel(i, j, colorDest);
        }
    }
}

  最后是程序运行效果,导入原始图片后,将右上角的BALL字符内部的红色替换为蓝色,如下图所示。
在这里插入图片描述
在这里插入图片描述
参考文献:
[1]https://zhidao.baidu.com/question/1312602947632691539.html

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

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

相关文章

8-图像放大

其实&#xff0c;就是开辟一个zoomwidth&#xff0c;zoomheight的内存&#xff0c;再分别赋值即可。 void CDib::Maginify(float xZoom, float yZoom) { //指向原图像指针 LPBYTE p_data GetData(); //指向原像素的指针 LPBYTE lpSrc; //指向缩放图像对应像素的指针 LPBYTE l…

当word表格复制到excel出现分行问题的解决小技巧

在word文档中将^p&#xff08;回车符号&#xff09;替换成其他&#xff0c;比如 全选复制粘贴到excel中后分行问题已经解决&#xff0c;将换回原本的回车即可&#xff0c;ctrshiftj&#xff08;回车&#xff09;

新零售SaaS架构:什么是线上商城系统?

零售商家为什么要建设线上商城 传统的实体门店服务范围有限&#xff0c;只能吸引周边500米内的消费者。因此&#xff0c;如何拓展服务范围&#xff0c;吸引更多消费者到店&#xff0c;成为了店家迫切需要解决的问题。 缺乏忠实顾客&#xff0c;客户基础不稳&#xff0c;往往是…

Git提交代码进入coding

安装Git后建一个文件在文件里右键点击Git Bash使用命令配置用户名和邮箱git config --global user.name "你的用户名"和git config --global user.email "你的邮箱"命令git init来初始化&#xff0c;自动将当前仓库设置为master创建一个项目&#xff08;一…

Linux - 安装 nacos(详细教程)

目录 一、简介二、安装前准备三、下载与安装四、基本配置五、单机模式 一、简介 官网&#xff1a;https://nacos.io/ GitHub&#xff1a;https://github.com/alibaba/nacos Nacos 是阿里巴巴推出的一个新开源项目&#xff0c;它主要是一个更易于构建云原生应用的动态服务发现…

什么是接口

接口定义 接口的定义分为接口的声明和接口体 接口构成 接口声明&#xff1a; ① 声明&#xff1a;关键字interface ② 格式&#xff1a;interfac接口名字 接口体 ① 两部分&#xff1a;常量和方法定义。 ② 内容&#xff1a;仅声明抽象方法&#xff0c; 不实现方法(没有方法体…

如何实现幂等性,java多线程面试题及答案整理

订单创建接口&#xff0c;第一次调用超时了&#xff0c;然后调用方重试了一次。是否会多创建一笔订单&#xff1f; 订单创建时&#xff0c;我们需要去扣减库存&#xff0c;这时接口发生了超时&#xff0c;调用方重试了一次。是否会多扣一次库存&#xff1f; 当这笔订单开始支…

【单调栈】代码随想录算法训练营第五十九天 |503.下一个更大元素II, 42. 接雨水 (待补充)

503.下一个更大元素II 1、题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2、文章讲解&#xff1a;代码随想录 3、题目&#xff1a; 给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;输出每个元素的下一个…

使用R语言计算模拟二项分布

二项分布理论 二项分布是一种离散概率分布&#xff0c;描述了在n次独立重复的伯努利试验中成功的次数的概率分布。其中&#xff0c;每次试验的结果只有两个可能&#xff1a;成功或失败&#xff0c;且每次试验的成功概率p是相同的。 具体来说&#xff0c;如果随机变量X表示在n次…

婚恋源码-婚恋交友系统-源码婚恋交友系统-APP小程序H5公众号-源码交付-支持二开!

本婚恋系统是一款专门为单身人士打造的相亲交友软件&#xff0c;所有用户都必须要身份认证&#xff0c;还有职业认证、学历认证等等全方位认证。智能匹配是本婚恋系统的核心功能&#xff0c;当我们完善好个人资料通过审核&#xff0c;系统会根据个人信息进行匹配&#xff0c;自…

3.1_8 两级页表

文章目录 3.1_8 两级页表&#xff08;一&#xff09;单级页表存在的问题&#xff08;二&#xff09;如何解决单级页表的问题&#xff1f;&#xff08;三&#xff09;两级页表的原理、地址结构&#xff08;四&#xff09;如何实现地址变换&#xff08;五&#xff09;需要注意的几…

SpringBoot之Bean扫描、Bean注册

目录 Bean扫描 Bean注册 Bean lmport 自定义注解 注册条件 Bean扫描 Bean扫描有两种方式 1、标签:<context:component-scan base-package"com.mybatis"/> 2、注解: ComponentScan(basePackages "com.mybatis") springboot启动类注解可以自…

Java垃圾收集器工作原理、优缺点以及使用注意事项

0.前言 Java 垃圾收集器 (GC) 是自动内存管理组件&#xff0c;负责回收不再使用的对象占用的内存。它们在管理 Java 的动态内存分配方面发挥着至关重要的作用&#xff0c;使开发人员能够专注于应用程序逻辑&#xff0c;而无需手动释放内存。JVM运行时需要GC来防止内存泄漏、优…

YOLOv5 | 涨点复现!YOLOv5添加BiFPN有效提升目标检测精度

目录 &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680;&#x1f680; 介绍&#xff1a; BiFPN 代码实现 ⭐欢迎大家订阅我的专栏一起学习⭐ &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及…

苍穹外卖-后端多模块项目搭建

由于视频中给出了项目一些基础代码,因此自己从0开始搭建一个。 文末附pom.xml。 新建项目并连接github 首先新建项目,项目名称为sky-take-out-1,如下图:父模块任何环境都不要,只需要指定springboot版本。 选定一些依赖:例如Lombok(自动注解)、SpringWeb、MyBatis Fra…

Java数据结构-二叉树

文章目录 前言一、树型结构1.1概念1.2 知识点1.3 树的表示形式1.4 树的应用 二、二叉树2.1 概念2.2 两种特殊的二叉树2.3 二叉树的性质2.4 二叉树的存储2.5 二叉树的基本操作2.5.1 二叉树的遍历2.5.2 二叉树的基本操作 前言 对学习的二叉树的知识进行总结。 一、树型结构 1.1…

学习JAVA的第二十一天(基础)

目录 多线程 线程&#xff1a; 进程&#xff1a; 并发&#xff1a; 并行&#xff1a; 多线程的实现方式&#xff1a; Thread类 Runnable接口 Callable接口和Future接口 成员方法 线程的生命周期 线程的安全问题 前言&#xff1a;学习JAVA的第二十天&…

经典数组和指针笔试题解析——C语言

【本节内容】 1. 数组和指针笔试题解析 2. 指针运算笔试题解析 1. 数组和指针笔试题解析 1.1 一维数组 #include <stdio.h> int main() {int a[] { 1,2,3,4 };printf("%zd\n", sizeof(a));printf("%zd\n", sizeof(a 0));printf("%zd\n&qu…

如何保证Redis和数据库数据一致性

缓存可以提升性能&#xff0c;减轻数据库压力&#xff0c;在获取这部分好处的同时&#xff0c;它却带来了一些新的问题&#xff0c;缓存和数据库之间的数据一致性问题。 想必大家在工作中只要用了咱们缓存势必就会遇到过此类问题 首先我们来看看一致性&#xff1a; 强一致性…

Datawhale【Sora原理与技术实战】| 学习笔记3

目录 一. 训练 Sora 模型二. 数据预处理三. 视频 VQVAE四. Diffusion Transformer 一. 训练 Sora 模型 Open-Sora 在下图中总结了 Sora 可能使用的训练流程&#xff1a; 链路: 二. 数据预处理 目前主流 LLM 框架缺乏针对 video 数据 统一便捷的管理和处理能力&#xff0c;…