缘由

看过上篇文章《OpenCvSharp基于颜色反差规避FBA面单贴标(2)》的都应该有印象这么一行代码:

// 面单颜色列表(十六进制格式)
privatestaticreadonly List<string> LabelColors = new List<string>
{
"#7C7C7C", "#707070", "#5E5E5E", "#8F8F8D", "#5F5F5F", "#CBCBC9","#FFFFFF","#FEFEFE","#FCFCFC" ,"#7B7B7B","#828282","#7D7D7D","#787878","#D7D7D5","#777777","#7F7F7F"
};

   每次有不同颜色或者无法定位的面单,都需要人工补录面单的背景色HEX,那么能不能集成一个工具,自动吸取图片色号保存后,这里能立即生效呢?答案是肯定的!先看看动态效果图:

  1. 点击取色,跟随鼠标实时显示背景色便于定位

  2. 快捷键Alt+C,抓取当前鼠标所在背景色存储到列表并存储到根目录colorHistory.json文件,便于其他地方读取

  3. 列表支持右键删除错误颜色(如下图)

  4. 其他地方读取抓取的颜色列表

保存的json文件格式如下:

[
"#018DBE",
"#B1C681",
"#03231E",
"#61CB81",
"#00424A",
"#B5BD68",
"#A3D9A3",
"#F68A1E",
"#0E83BA",
"#861B2D",
"#059BBC"
]

  每次抓取都会往json存储当前最新色号,然后其他地方实时读取json即可:

//// 面单颜色列表(十六进制格式)
//private static readonly List<string> LabelColors = new List<string>
//{
// "#7C7C7C", "#707070", "#5E5E5E", "#8F8F8D", "#5F5F5F", "#CBCBC9","#FFFFFF","#FEFEFE","#FCFCFC" ,"#7B7B7B","#828282","#7D7D7D","#787878","#D7D7D5","#777777","#7F7F7F"
//};
static List<string> LabelColors = new List<string>();
privatestatic List<string> LoadColorList()
{
try
{
string historyFilePath = System.Windows.Forms.Application.StartupPath + @"\colorHistory.json";
if (File.Exists(historyFilePath))
{
string json = File.ReadAllText(historyFilePath);
var hexList = JsonSerializer.Deserialize<List<string>>(json); foreach (var hex in hexList)
{
if (!string.IsNullOrEmpty(hex))
{
LabelColors.Add(hex);
}
}
return LabelColors;
}
}
catch (Exception ex)
{
MessageBox.Show($"加载历史记录失败: {ex.Message}", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
returnnull;
}

  

private List<Color> colorHistory = new List<Color>();
private MagnifierForm magnifierForm;
privatestring historyFilePath = "colorHistory.json";
private ContextMenuStrip historyContextMenu;

  

// 初始化右键菜单
privatevoidInitializeContextMenu()
{
historyContextMenu = new ContextMenuStrip(); ToolStripMenuItem deleteItem = new ToolStripMenuItem("删除选中颜色");
deleteItem.Click += DeleteItem_Click; ToolStripMenuItem clearAllItem = new ToolStripMenuItem("清空所有历史");
clearAllItem.Click += ClearAllItem_Click; ToolStripMenuItem copyItem = new ToolStripMenuItem("复制颜色值");
copyItem.Click += CopyItem_Click; historyContextMenu.Items.AddRange(new ToolStripItem[] {
copyItem, deleteItem, clearAllItem
}); lstHistory.ContextMenuStrip = historyContextMenu;
LoadColorHistory();
// 设置ListBox为自绘模式
lstHistory.DrawMode = DrawMode.OwnerDrawFixed;
lstHistory.DrawItem += LstHistory_DrawItem;
}

  ListBox实时显示当前吸取的背景色,重绘代码如下:

// 绘制ListBox项
privatevoidLstHistory_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index < 0 || e.Index >= colorHistory.Count) return; e.DrawBackground(); Color color = colorHistory[e.Index];
string text = $"{ColorToHex(color)} - RGB({color.R},{color.G},{color.B})"; // 绘制颜色块
Rectangle colorRect = new Rectangle(e.Bounds.Left + 2, e.Bounds.Top + 2, 20, e.Bounds.Height - 4);
using (SolidBrush brush = new SolidBrush(color))
{
e.Graphics.FillRectangle(brush, colorRect);
}
e.Graphics.DrawRectangle(Pens.Black, colorRect); // 绘制文本
Rectangle textRect = new Rectangle(e.Bounds.Left + 25, e.Bounds.Top, e.Bounds.Width - 25, e.Bounds.Height);
using (SolidBrush textBrush = new SolidBrush(e.ForeColor))
{
e.Graphics.DrawString(text, e.Font, textBrush, textRect);
} e.DrawFocusRectangle();
}

  RGB和HEX 相互转换

// HEX字符串转Color
private Color HexToColor(string hex)
{
try
{
// 移除#号
hex = hex.Replace("#", ""); // 处理3位HEX
if (hex.Length == 3)
{
hex = $"{hex[0]}{hex[0]}{hex[1]}{hex[1]}{hex[2]}{hex[2]}";
} // 处理6位HEX
if (hex.Length == 6)
{
byte r = Convert.ToByte(hex.Substring(0, 2), 16);
byte g = Convert.ToByte(hex.Substring(2, 2), 16);
byte b = Convert.ToByte(hex.Substring(4, 2), 16);
return Color.FromArgb(r, g, b);
} return Color.Empty;
}
catch
{
return Color.Empty;
}
} // 颜色转HEX
privatestringColorToHex(Color color)
{
return$"#{color.R:X2}{color.G:X2}{color.B:X2}";
}

  

结束语

感谢各位耐心查阅! 如果您有更好的想法欢迎一起交流,有不懂的也可以微信公众号联系博主,作者公众号会经常发一些实用的小工具和demo源码,需要的可以去看看!另外,如果觉得本篇博文对您或者身边朋友有帮助的,麻烦点个关注!赠人玫瑰,手留余香,您的支持就是我写作最大的动力,感谢您的关注,期待和您一起探讨!再会!(公众号回复“takecolor”获取完整代码)

c#造个轮子-取色器TakeColor(附源码)的更多相关文章

  1. 使用工厂方法模式实现多数据库WinForm手机号码查询器(附源码)

    先讲一下简单工厂模式.工厂方法模式.抽象工厂模式的东西: 简单工厂模式(Simple Factory Pattern):工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关类,也就是说产品 ...

  2. 日志组件Log2Net的介绍和使用(附源码开源地址)

    Log2Net是一个用于收集日志到数据库或文件的组件,支持.NET和.NetCore平台. 此组件自动收集系统的运行日志(服务器运行情况.在线人数等).异常日志.程序员还可以添加自定义日志. 该组件支 ...

  3. C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)

    前言:之前的两篇封装了一些基础的表单组件,这篇继续来封装几个基于bootstrap的其他组件.和上篇不同的是,这篇的有几个组件需要某些js文件的支持. 本文原创地址:http://www.cnblog ...

  4. 轻量级通信引擎StriveEngine —— C/S通信demo(2) —— 使用二进制协议 (附源码)

    在网络上,交互的双方基于TCP或UDP进行通信,通信协议的格式通常分为两类:文本消息.二进制消息. 文本协议相对简单,通常使用一个特殊的标记符作为一个消息的结束. 二进制协议,通常是由消息头(Head ...

  5. (原创)通用查询实现方案(可用于DDD)[附源码] -- 简介

    [声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3985353.html).   [系列文章] 通用查询实现方案(可用于DDD)[附源码] -- ...

  6. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(6)-Unity 2.x依赖注入by运行时注入[附源码]

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(6)-Unity 2.x依赖注入by运行时注入[附源码] Unity 2.x依赖注入(控制反转)IOC,对 ...

  7. Mybatis+SpringMVC实现分页查询(附源码)

    Maven+Mybatis+Spring+SpringMVC实现分页查询(附源码) 一.项目搭建 关于项目搭建,小宝鸽以前写过一篇Spirng+SpringMVC+Maven+Mybatis+MySQ ...

  8. ASP.NET程序读取二代身份证(附源码)

    原文:ASP.NET程序读取二代身份证(附源码) 一般来说winform应用程序解决这个问题起来时很容易的,web应用程序就麻烦一点了. 这里我说说我的解决思路: 一.你必要有联机型居民身份证阅读器一 ...

  9. 基于Redis缓存的Session共享(附源码)

    基于Redis缓存的Session共享(附源码) 在上一篇文章中我们研究了Redis的安装及一些基本的缓存操作,今天我们就利用Redis缓存实现一个Session共享,基于.NET平台的Seesion ...

  10. 为SRS流媒体服务器添加HLS加密功能(附源码)

    为SRS流媒体服务器添加HLS加密功能(附源码) 之前测试使用过nginx的HLS加密功能,会使用到一个叫做nginx-rtmp-module的插件,但此插件很久不更新了,网上搜索到一个中国制造的叫做 ...

随机推荐

  1. POLIR-Laws-民法典: 非常有用的: 第六章 民事法律行为 + 第三编 合同

    民法典: 第六章 民事法律行为 + 第三编 合同 第六章 民事法律行为 第一节 一般规定 名事法律行为 是 民事主体 通过 意思表示 立更变止(CRUD: 设立.变更.终止) 民事法律关系的行为. A ...

  2. 万人同屏 角色动画优化 Animation Instancing动画实例化– SkinnedMeshRenderer的实例化 GPU Instancing

    在上一篇文章中有个技术点引发了我的好奇 GPU Instancing 这个技术是Unity自带的功能,但是他不支持SkinnedMeshRenderer,所以要采用特殊方法 他这里采用GPU蒙皮+EC ...

  3. 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-23- 操作鼠标拖拽 - 番外篇(详细教程)

    1.简介 跟随宏哥学习的小伙伴或者童鞋们想必已经在宏哥Python+Playwright系列文章中知道宏哥如何处理前边文章中提到的反爬虫机制.今天跟随宏哥看一下java语言是如何处理的,已经按照之前的 ...

  4. GitHub开源项目:IT-Tools源码构建部署及其部署排错

    环境准备 物理环境:win11专业版/Ubuntu-24.04.2 安装 Node.js(推荐 v20+)和 pnpm(包管理器). 克隆项目代码: git clone https://github. ...

  5. python 获取163 邮箱的邮件信息

    此案例是是获取的一个亚马逊的验证码 import time from imaplib import IMAP4_SSL import imaplib,email,datetime from lxml ...

  6. 终于有人讲明白了!解读Agent 4大协议:MCP/ACP/A2A/ANP

    大家好,我是汤师爷,专注AI智能体分享,致力于帮助100W人用智能体创富~ 最近这几年,AI智能体(Agent)越来越火了. 不少人可能还停留在AI就是个聊天机器人的认知,其实现在的AI智能体,已经能 ...

  7. sqlserver 循环中定义变量一定要小心,否则你的数据就是错误的

    下面是个小实验可以自己试试 -- 先创建一个表 实验用create table test_5(id int identity(1,1),na varchar(50),)-- 将数据插入表中,插入nul ...

  8. [笔记]CDQ 分治

    前 CDQ 分治是一种分治算法,或者说是一种思想,其主要内容是:将序列通过递归的方式分给左右两个区间,每一个子问题只处理跨左右区间的贡献. 使用 CDQ 分治建立在排序的基础上,这也说明 CDQ 分治 ...

  9. Web前端入门第 84 问:JavaScript sessionStorage 那些容易踩坑的地方

    sessionStorage 与 localStorage 差不多可以算作一对兄弟,它俩的暴露的 API 方法一模一样. 但两者也有不同点: 1.sessionStorage 存入的数据在页面关闭后, ...

  10. Wordpress 通过 SQL 直接获取文章链接

    SELECT wpp.post_title, wpp.guid, wpp.post_date, REPLACE( REPLACE( REPLACE( REPLACE( wpo.option_value ...