news 2026/4/18 14:21:17

c#造个轮子-取色器TakeColor(附源码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
c#造个轮子-取色器TakeColor(附源码)

缘由

看过上篇文章《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,那么能不能集成一个工具,自动吸取图片色号保存后,这里能立即生效呢?答案是肯定的!先看看动态效果图:

123123

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

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

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

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

image

保存的json文件格式如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

[

"#018DBE",

"#B1C681",

"#03231E",

"#61CB81",

"#00424A",

"#B5BD68",

"#A3D9A3",

"#F68A1E",

"#0E83BA",

"#861B2D",

"#059BBC"

]

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

//// 面单颜色列表(十六进制格式)

//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;

}

116076-20250310125032345-1793233350[1]

1

2

3

4

private List<Color> colorHistory = new List<Color>();

private MagnifierForm magnifierForm;

privatestring historyFilePath = "colorHistory.json";

private ContextMenuStrip historyContextMenu;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

// 初始化右键菜单

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实时显示当前吸取的背景色,重绘代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

// 绘制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 相互转换

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

// 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源码,需要的可以去看看!另外,如果觉得本篇博文对您或者身边朋友有帮助的,麻烦点个

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 2:02:43

RCE(远程命令执行)漏洞全解析:从原理到实战

概述 (Overview) 远程命令/代码执行 (RCE) 漏洞允许攻击者在目标服务器上执行任意的操作系统命令或应用程序代码。这是最高危的漏洞类型之一&#xff0c;成功利用通常意味着攻击者可以完全控制服务器。 远程命令执行: 指的是应用程序接收用户输入&#xff0c;并将其&#xff…

作者头像 李华
网站建设 2026/4/18 2:03:15

【毕业设计】基于WEB的景点门票销售系统基于JAVA白云山景点门票销售管理系统(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/18 2:03:24

【毕业设计】基于springboot+微信小程序的餐厅预约系统设计与实现(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/18 2:03:18

【毕业设计】基于springboot+微信小程序的钓鱼交友与渔具回收的微信小程序开发(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华