文章目录

  • 颜色与灰度
    • 互补色与对比色
    • 灰度
  • 透明度混合
    • 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]根据背景色计算文本颜色相关推荐

  1. 技巧: 根据背景色自适应文本颜色

    针对企业服务来说,最终用户往往需要更加细化的信息分类方式,而打标签无疑是非常好的解决方案. 如果标签仅仅只提供几种颜色可能无法满足各个用户的实际需求.那么系统就需要为用户提供颜色选择.事实上我们完全无 ...

  2. CSDN的markdown编辑器使用(含表格背景色、文本颜色字体字号、锚点跳转、表情符号等)

    内容介绍   最近在使用csdn的markdown编辑器写东西时发现了一些有趣的东西,下面简单列举一下,希望对看到的小伙伴有所帮助(本文目的为演示编辑效果,目录显示较乱). 一.基础编辑 1.目录 各 ...

  3. Android TextView 设置文字背景色或文字颜色,字体阴影,字体样式

          String str="这是设置TextView部分文字背景颜色和前景颜色的demo!";         int bstart=str.indexOf("背 ...

  4. CSS入门五:文本样式;字体颜色:英文字母,十六进制,RGB;文本颜色,字间距,行间距,对齐方式;下划线、上划线…,文本阴影,字母大小写,首行缩进

    CSS入门部分已经了解了:CSS简介.样式表分类,内部样式表简单使用:选择器和类选择器简单使用:背景色.背景图:以及外部样式表的简单使用: 本篇博客主要介绍,如何对文本设置,包括字体颜色:字间距,行间 ...

  5. html字体颜色反色,HTML5:画布上的反色文本颜色

    更新:大多数较新的浏览器现在支持混合模式"差异",可以达到相同的效果. context.globalCompositeOperation = "difference&qu ...

  6. 【CSS笔记】CSS文本颜色、字母大小写、文本对齐、文本装饰线、文本字体

    目录 一.CSS笔记 1.1.CSS文本颜色 1.2.CSS字母大小写 1.3.CSS文本对齐 1.4.CSS文本缩进.间距.行高 (1)如何计算行高??? 1.5.CSS文本装饰线 1.6.CSS字 ...

  7. html去掉文字蓝色选中效果,使用CSS3的::selection改变选中文本颜色的方法

    浏览器上页面文字选中后默认的背景色是一种蓝色, 不同浏览器的颜色有些许差异,但大致相同,文字颜色也近乎白色,如下图所示,截自Firefox3.6浏览器: 在CSS3的爸爸妈妈还没有相亲认识的时候,要改 ...

  8. C语言必会100题(7)。输入星期的第一个字母来判断一下是星期/Press any key to change color/学习gotoxy()与clrscr()函数/练习函数调用/文本颜色设置

    特此鸣谢:鱼C_小甲鱼(B站up主)不二如是(鱼C论坛大佬) 题目来源:https://fishc.com.cn 注:这些题在网上都可以搜到,题下面的代码大多是流传下来的答案(我重新排了一下版,增加了 ...

  9. 如何在Windows终端中更改文本颜色

    目录 介绍 终端颜色 使用代码 辅助函数 处理对比度 有趣的点 下载 color.zip - 1.9 KB 介绍 终端的默认文本输出是单色的,并且不提供提供上下文的简单方法.例如,您可能希望错误以红色 ...

最新文章

  1. VS2005发布、生成网站时如何设置固定的dll文件名?
  2. php 企业微信指令回调借款_企业微信外部联系人回调事件
  3. MYSQL基础语法的使用
  4. 一种Android闪屏页实现方法(偏门别类)
  5. Xamarin For Android 打包编译APK文件详细图文教程
  6. 面试官:为什么要用 Spring?它到底解决了什么问题?
  7. 数学画图软件_关于数学建模(或科研绘图)的画图学习建议
  8. php私人云,PHP源码Cloudreve乐云网盘私人云盘源码 资源下载不限速功能
  9. mbp网速很慢_macbook上网速度慢(mac网速慢解决方案)
  10. 游戏开发工具引擎/模拟器收集
  11. 未来物联网的一些问题
  12. 使用 matplotlib绘制简单图形,保存图片的方法
  13. android源码下载(下)
  14. C语言程序设计基础知识——谭浩强版
  15. 降维的基本知识点总结
  16. 迷宫寻宝(BFS模板题)
  17. 三次技术转型,程序员的北漂奋斗史 | 程序员有话说
  18. 总结论文中正负样本的选择
  19. 程序员最全职业技能知识体系图谱
  20. python爬取歌词生成词云图_爬取毛不易歌词作词云展示

热门文章

  1. Java基础笔试练习(八)
  2. VL53L0X+stm32激光测距
  3. 鸿蒙分期靠谱吗,花呗借呗“陷阱”正式被确认,这两个禁忌不要触碰,别说没提醒你...
  4. 邮储社招Java笔试题_2019年及历年中国邮政储蓄银行社招笔试题和参考答案6套
  5. 茄子总结31/8/2022
  6. python爬虫需要哪些基础知识-【PYTHON】【爬虫】关于python爬虫的一些基础知识
  7. C语言_递归_计算x的y次方
  8. Vue + 原生Canvas实现生成电子证书的实践
  9. Qt开发之路59---QPushButton的pressed,released,clicked,toggled响应的区别
  10. 《密码安全新技术》课程总结报告