背景色千差万别,如果希望在这样复杂的背景色下显示清晰可辨的前景色(例如显示文字),那如何选择这样的前景色才能确保适用于所有的背景呢?


灰度图的心理学公式

红绿蓝三色是非常不直观的颜色表示的方法,如果不经过训练,人类几乎没有办法直接通过 RGB 的值来猜出大概的颜色来。而 HSB 是用来解决人眼感知问题的,它将颜色用色相、饱和度、明度来表示。

可是,即便是 HSB 也不能完美解决人眼的感知问题。看下图,黄色和蓝色的饱和度和明度一样,只是色相不同,你觉得哪一个颜色更亮,哪一个更暗?

相信大家都会觉得黄色更亮,蓝色总给人一种阴暗的感觉。

所以,在饱和度和明度之外,一定还有一种人眼对亮度的感觉是与色相相关的。

我们将不同色相的颜色排成一圈,观察下哪些颜色更亮,哪些更暗:

我们将上面的不同颜色直接转成灰度图像,这是最能反映人眼感知的灰度图像,它将是这样的:

也就是说,不同的颜色值总能找到一个人眼感知的灰度值,这是著名的心理学公式:

灰度 = 红×0.299 + 绿×0.587 + 蓝×0.114

在灰度背景色上决定前景色

一个图像的每一个像素经过上面的公式计算得到的新的图像,即是人眼感知亮度的灰度图。

于是,当我们期望计算一个能在背景色上清晰显示的前景色时,我们可将背景颜色转换为灰度颜色,然后根据灰度程度,选取黑色或白色作为前景色。

当然,如果你喜欢,可以将一段黑色或接近于黑色的灰度色作为浅色背景的前景;将一段白色或颉俊宇白色的灰度色作为深色背景的前景。

代码实现

为了实现这个效果,我们先写一个灰度/亮度的计算函数:

/// <summary>
/// 获取一个颜色的人眼感知亮度,并以 0~1 之间的小数表示。
/// </summary>
private static double GetGrayLevel(Color color)
{return (0.299 * color.R + 0.587 * color.G + 0.114 * color.B) / 255;
}

然后写一个根据感知亮度计算反色的方法:

private static Color GetReverseForegroundColor(double grayLevel) => grayLevel > 0.5 ? Colors.Black : Colors.White;

于是,当我们希望计算某个背景色上一定能清晰显示的前景色时,只需要调用 GetReverseForegroundColor 即可。



我封装的方便的 API

不过,总是写后台代码来计算,对于 XAML 类的程序来说还是麻烦了些,于是我写了一些用于 XAML 的标记扩展,方便让一些文字自动根据背景色改变颜色。

这是期望的最简用法:

<TextBlock Foreground="{media:LuminancedForeground}" Text="我是前景 by walterlv"/>

因为内部已经使用绑定来实现动态变化,所以,无需在颜色更改时再次更新:

由于这份封装的 API 目前还在完善中,会经常改动,所以只贴出 GitHub 仓库地址,不放在这里:

  • LuminanceForegroundExtension 写出此用法的关键类
  • LuminanceReverseColor 包含亮度灰度值反色的逻辑
  • DependencyMarkupExtension 给标记扩展中一些恶心的代码提供封装

参考资料

  • Luma (video) - Wikipedia
  • 从RGB色转为灰度色算法(转) - carekee - 博客园

分享一个算法,计算能在任何背景色上清晰显示的前景色相关推荐

  1. 分享一个:如何把电商平台上的买家秀文字评论生成excel表格保存起来?

    现在做店铺,不像以前那么容易了.不要想着开着店,每天都会有人来逛,有人来买了.现在要是没花心思上货做店铺美工,没有做好买家售后服务,更重要是要请买家多来评价一下产品.这样才能给店增加流量和成交量的.这 ...

  2. 分享一个可以把模糊动漫图片变清晰的网站(基于超像素)

    超像素的地址:http://waifu2x.udp.jp/ github:https://github.com/nagadomi/waifu2x 本程序使用卷积神经网络对动漫风格的图片进行放大操作(支 ...

  3. android中点击按钮弹出一个编辑框,本人是在Button的基础上加了Dialog,Dialog添加了一个编辑框,怎么将Button上的显示文字变成...

    button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Alert ...

  4. (转)分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)...

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  5. 问题描述 给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底

    问题描述 给定一个由n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大. 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径 ...

  6. 问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子

    问题描述: 在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并成一堆. 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将n堆石子 ...

  7. java计算一个多边形的重心_2D凸多边形碰撞检测算法(二) - GJK(上)

    2D凸多边形碰撞检测算法(二) - GJK(上) 原理 在 Narrow Phase 精细碰撞检测中,除了 SAT ,另外一个就是 GJK(Gilbert–Johnson–Keerthi)算法.它足够 ...

  8. python计算n阶乘中尾部零的个数_(Java)设计一个算法,计算出n阶乘中尾部零的个数...

    展开全部 long 类型对大数阶乘来e68a8462616964757a686964616f31333365633963说存储范围大小,强行使用会溢出,可以使用 BigDecimal. 代码如下:im ...

  9. 回溯法——设计一个算法在1、2、3... 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性和全排列

    回溯法 题目描述: 设计一个算法在1.2.3- 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性.例如1+2+34-5+67-8+9=100 分 ...

最新文章

  1. unittest笔记
  2. java超级简单贪吃蛇_java实现简易贪吃蛇游戏
  3. cpu进程调度---RT Throttling【转】
  4. 一个路由器两个网段互通_如何判断两个IP地址是否在同一个网段?什么是子网掩码?...
  5. 二叉排序数的构造-理论
  6. vue路由+ elementUI表格组件:loop文章列表页enter内容页(vue路由传参userid)- 代码篇
  7. 通过Nacos让Nginx拥有服务发现能力
  8. 中内连和外联的去区别_喜欢和爱的区别是什么?“爱”的繁体字会告诉你答案...
  9. 技术一般,却被破格提拔,背后肯定有黑幕?
  10. (十四)java版spring cloud+spring boot+redis社交电子商务平台-在springboot中用redis实现消息队列...
  11. 301.删除无效的括号
  12. java teechart怎么用_TeeChart for Java
  13. java 反译md5加密_Java MD5加密与反编译
  14. 软件岗位--CTO、技术VP、技术总监、首席架构师
  15. 【语义分割数据集】——cityscape数据集类别名称
  16. 计算机c盘小对计算机的影响吗,电脑卡真的跟C盘容量有关系吗?
  17. 基于httpx和pyside2的哔哩哔哩(bilibili)-视频下载程序
  18. 计算机专业考研难度排名?
  19. EC-PCA: 利润中心会计流程设计和方案要点
  20. 春天的马车曲(横光利一)

热门文章

  1. Spark GraphX 聚合操作
  2. 台式计算机时间不准,电脑时间总是不对怎么办 电脑时间总是不对解决方法
  3. 无锡设计类——平面设计培训班学费一般多少?
  4. 嵌入式工程师面试题集汇总
  5. Python下划线命名模式
  6. 全民超神服务器正在维护6,全民超神8月31日0:00-6:00iOS停服更新
  7. 关键字extern用法
  8. 百度Echarts时间轴的注意事项
  9. Android端切图规范
  10. 520女生送男生什么礼物好?520送男生礼物清单