[go]根据背景色计算文本颜色
文章目录
- 颜色与灰度
- 互补色与对比色
- 灰度
- 透明度混合
- Alpha blending
- Premultiplied Alpha
- go文本颜色
- 文本蒙版
在图片中添加文字是常见的操作(如何添加参见《 gg库绘图与添加文字》),怎样保证添加的文字有很好的辨识度呢?
颜色与灰度
RGB颜色空间以R(Red:红)、G(Green:绿)、B(Blue:蓝)三种基本色为基础,进行不同程度的叠加,产生丰富而广泛的颜色。
最能反映人眼感知的是灰度图像,要获取清晰的前景色,可转换为灰度图后来计算前景色。
互补色与对比色
色相环(colorcircle):是指一种圆形排列的色相光谱(SPECTRUM),色彩是按照光谱在自然中出现的顺序来排列的;暖色(WARMCOLOR)位于包含红色和黄色的半圆之内,冷色则包含在绿色和紫色的那个半圆内。
互补色:当两个颜色的色相,在色相环中的夹角为180°时,这两个颜色互为补色,也就是“互补色”。
通过RGB可方便地计算器互补色:用255减去对应的RGB后,得到的颜色即为互补色。
对比色:当两个颜色的色相,在色相环中的夹角大于130°时,这两个颜色就有明显的对比关系了,夹角越大,对比关系越强。
灰度
灰度图,每个像素点只能有一个值表示颜色,它的像素值在0到255之间,0是黑色,255是白色,中间值是一些不同等级的灰色,可以说灰度是黑与白之间的过渡色。
通过RGB,可方便计算出对应的灰度:
(299*R + 587*G + 114*B)/1000
一个图像经过上面公式计算后,即得到人眼感知的灰度图;当期望在背景色上显示清晰的前景色(文本)时,即可根据背景的灰度确定使用黑色或白色。
透明度混合
透明度混合(Alpha blending)是把透明度混合进个颜色中,方便颜色计算:
DestinationColor.rgb = (SourceColor.rgb * SourceColor.a) + (DestinationColor.rgb * (1 - SourceColor.a))
Alpha blending
最常见的像素表示格式是RGBA8888,即(r,g,b,a),每个通道8位。为了表示方便,alpha通道一般记成正规化为0~1的浮点数:
如红色60%透明度就是(255, 0, 0, 153),正规化后为(255, 0, 0, 0.6);而 Premultiplied Alpha 则是把RGB通道乘以透明度也就是(r*a, g*a, b*a, a)
,也就是变成(153, 0, 0, 0.6)。
透明通道在渲染的时候通过Alpha Blending产生作用,混合后的颜色计算公式(如一个透明度为asa_sas的颜色CsC_sCs,渲染到颜色CdC_dCd上):
Co=as∗Cs+(1−as)∗CdC_o = a_s*C_s + (1 − a_s)*C_dCo=as∗Cs+(1−as)∗Cd
如果颜色以Premultiplied Alpha形式存储(CsC_sCs已经乘以透明度了),则混合公式变成了:
Co=Cs′+(1−as)∗CdC_o = C_s^′ + (1 − a_s)*C_dCo=Cs′+(1−as)∗Cd
Premultiplied Alpha
Premultiplied Alpha后的像素格式变得不直观,但混合的时候可以少一次乘法,这可以提高一些效率;除此之外最主要的是:没有Premultiplied Alph的纹理无法进行Texture Filtering(纹理过滤,除非使用最近邻插值):
Premultiplied Alpha最重要的意义是使得带透明度的图片纹理可以正常的进行线性插值;这样旋转、缩放或者非整数的纹理坐标才能正常显示,否则在透明像素边缘附近产生奇怪的颜色。
go文本颜色
go中通过image.At
获取对应位置的颜色,然后通过color.RGBA()
返回对应的R,G,B值;但其值是Premultiplied Alpha的,要转换成灰度,需要:
(19595*r + 38470*g + 7471*b + 1<<15) >> 24
。
若只是把图片转换成黑白的,可直接使用color.GrayModel.Convert
来方便实现。
要根据背景色来确定文本颜色(以黑、白为例),提取文字显示位置处的颜色,转换为灰度值后,根据其值确定是黑色或白色。
func calcTextColor(dc *gg.Context, x, y float64) color.Color {cur := dc.Image().At(int(x), int(y))//gray := color.GrayModel.Convert(cur)r, g, b, _ := cur.RGBA()lum := (19595*r + 38470*g + 7471*b + 1<<15) >> 24var txtColor color.Colorif lum > 158 {txtColor = color.NRGBA{A: 255}} else {txtColor = color.NRGBA{R: 255, G: 255, B: 255, A: 255}}return txtColor
}
要更好地处理文本颜色,可多取几个点平均,或者每个文本处获取对应的显示颜色。
文本蒙版
除计算文本颜色,便于显示文本外;还可以通过文本蒙版的方式显示:
func AddText(dc *gg.Context, txt string, tX int, tY int) {w, h := dc.MeasureString(txt)dc.SetHexColor("#CCCCCCCC")minY := math.Max(0.0, float64(tY)-h)dc.DrawRectangle(float64(tX), minY, w, h)dc.Fill()dc.SetHexColor("#333333")dc.DrawString(txt, float64(tX), minY+h)
}
通过画一个与文本相同大小的底框(填充深色),然后在上面显示文本(浅色)。
[go]根据背景色计算文本颜色相关推荐
- 技巧: 根据背景色自适应文本颜色
针对企业服务来说,最终用户往往需要更加细化的信息分类方式,而打标签无疑是非常好的解决方案. 如果标签仅仅只提供几种颜色可能无法满足各个用户的实际需求.那么系统就需要为用户提供颜色选择.事实上我们完全无 ...
- CSDN的markdown编辑器使用(含表格背景色、文本颜色字体字号、锚点跳转、表情符号等)
内容介绍 最近在使用csdn的markdown编辑器写东西时发现了一些有趣的东西,下面简单列举一下,希望对看到的小伙伴有所帮助(本文目的为演示编辑效果,目录显示较乱). 一.基础编辑 1.目录 各 ...
- Android TextView 设置文字背景色或文字颜色,字体阴影,字体样式
String str="这是设置TextView部分文字背景颜色和前景颜色的demo!"; int bstart=str.indexOf("背 ...
- CSS入门五:文本样式;字体颜色:英文字母,十六进制,RGB;文本颜色,字间距,行间距,对齐方式;下划线、上划线…,文本阴影,字母大小写,首行缩进
CSS入门部分已经了解了:CSS简介.样式表分类,内部样式表简单使用:选择器和类选择器简单使用:背景色.背景图:以及外部样式表的简单使用: 本篇博客主要介绍,如何对文本设置,包括字体颜色:字间距,行间 ...
- html字体颜色反色,HTML5:画布上的反色文本颜色
更新:大多数较新的浏览器现在支持混合模式"差异",可以达到相同的效果. context.globalCompositeOperation = "difference&qu ...
- 【CSS笔记】CSS文本颜色、字母大小写、文本对齐、文本装饰线、文本字体
目录 一.CSS笔记 1.1.CSS文本颜色 1.2.CSS字母大小写 1.3.CSS文本对齐 1.4.CSS文本缩进.间距.行高 (1)如何计算行高??? 1.5.CSS文本装饰线 1.6.CSS字 ...
- html去掉文字蓝色选中效果,使用CSS3的::selection改变选中文本颜色的方法
浏览器上页面文字选中后默认的背景色是一种蓝色, 不同浏览器的颜色有些许差异,但大致相同,文字颜色也近乎白色,如下图所示,截自Firefox3.6浏览器: 在CSS3的爸爸妈妈还没有相亲认识的时候,要改 ...
- C语言必会100题(7)。输入星期的第一个字母来判断一下是星期/Press any key to change color/学习gotoxy()与clrscr()函数/练习函数调用/文本颜色设置
特此鸣谢:鱼C_小甲鱼(B站up主)不二如是(鱼C论坛大佬) 题目来源:https://fishc.com.cn 注:这些题在网上都可以搜到,题下面的代码大多是流传下来的答案(我重新排了一下版,增加了 ...
- 如何在Windows终端中更改文本颜色
目录 介绍 终端颜色 使用代码 辅助函数 处理对比度 有趣的点 下载 color.zip - 1.9 KB 介绍 终端的默认文本输出是单色的,并且不提供提供上下文的简单方法.例如,您可能希望错误以红色 ...
最新文章
- VS2005发布、生成网站时如何设置固定的dll文件名?
- php 企业微信指令回调借款_企业微信外部联系人回调事件
- MYSQL基础语法的使用
- 一种Android闪屏页实现方法(偏门别类)
- Xamarin For Android 打包编译APK文件详细图文教程
- 面试官:为什么要用 Spring?它到底解决了什么问题?
- 数学画图软件_关于数学建模(或科研绘图)的画图学习建议
- php私人云,PHP源码Cloudreve乐云网盘私人云盘源码 资源下载不限速功能
- mbp网速很慢_macbook上网速度慢(mac网速慢解决方案)
- 游戏开发工具引擎/模拟器收集
- 未来物联网的一些问题
- 使用 matplotlib绘制简单图形,保存图片的方法
- android源码下载(下)
- C语言程序设计基础知识——谭浩强版
- 降维的基本知识点总结
- 迷宫寻宝(BFS模板题)
- 三次技术转型,程序员的北漂奋斗史 | 程序员有话说
- 总结论文中正负样本的选择
- 程序员最全职业技能知识体系图谱
- python爬取歌词生成词云图_爬取毛不易歌词作词云展示
热门文章
- Java基础笔试练习(八)
- VL53L0X+stm32激光测距
- 鸿蒙分期靠谱吗,花呗借呗“陷阱”正式被确认,这两个禁忌不要触碰,别说没提醒你...
- 邮储社招Java笔试题_2019年及历年中国邮政储蓄银行社招笔试题和参考答案6套
- 茄子总结31/8/2022
- python爬虫需要哪些基础知识-【PYTHON】【爬虫】关于python爬虫的一些基础知识
- C语言_递归_计算x的y次方
- Vue + 原生Canvas实现生成电子证书的实践
- Qt开发之路59---QPushButton的pressed,released,clicked,toggled响应的区别
- 《密码安全新技术》课程总结报告