© 2012-2023 Conmajia

文字描边效果主要用于在复杂或颜色近似的背景上区分文字内容。图 1 的动画截图中,字幕文字为浅色,所以采用了深色描边以区分字幕和动画内容。

图 1. 带字幕的动画截图(Wong Shao Voon)

常见的几种描边实现方法

1. 以图片方式处理文字像素并描边。如图 2 所示,首先将 TextBlock 转换为 WriteableBitmap,然后对 Pixels 进行循环,判断像素点值直至达成描边效果。这篇文章 对此进行了详细说明。

图 2. 图片方式处理描边

这种方法将文字转为图片,判断图片上每个像素点,效率较低,最终效果过于简单。

2. 像素着色器。该方法基本思路为:假定只会对 TextBlock 应用像素着色器,那么文字所在像素的 alpha 分量必定大于 0,否则必为透明像素。如果当前像素的上,下,左,右任意一个像素不透明,说明该像素需要描边,否则就输出文字颜色。实际处理方法可以参考 这篇文章​​​​​​​。

3. GDI+ 路径绘图。该方法利用了 GDI+ 中的绘图路径,通过将文字添加到 GraphicsPath 中进行绘制。利用不同的笔刷,这种方法可以得到非常华丽的描边效果,如图 3 所示。

图 3. GDI+ 路径绘图方法实现的描边效果

这种方法的另一优点是扩展性极佳,可以利用不同的笔刷如纹理、渐变,以及多次绘图等方法做出非常精美的描边、阴影效果。Code Project 网站 2009 年 9 月 C++/MFC 版块的最佳获奖文章 Outline Text 对此进行了详细介绍。

我的简易方法

又到了我的偷懒时间。

看了前面几种设计思路后,你有没有一头雾水的感觉?

或者眼花缭乱的感觉?

有没有一种可能,我们需要“描边”文字,但是并不一定非要去“描”它?

我在介绍山寨 Safari 面板时,提到过一种通过重复绘制文字实现简单高光效果的方法(参见《一步一步玩控件:TabControl——从制作山寨 Safari 窗体开始》)。

如图 4 所示,当底层文字和顶层文字相差 1px 时,会呈现出不同的阴影或者高光效果。我们把这个思路拓展一下,把上、下、左、右四个方向的偏差结合到一起,最后得到图 4 最后显示的效果一样,这就是一种“描边”。

图 4. 利用反复文字偏移实现类似描边的显示效果

接下来在GDI+里面实现它。

// Code by Conmajia
// txtPoint 是绘制文字的定位点
txtPoint.Offset(-1, 0);  // 绘制左背景文字
e.Graphics.DrawString(this.Text, this.Font, backBrush, txtPoint);
txtPoint.Offset(2, 0);  // 绘制右背景文字
e.Graphics.DrawString(this.Text, this.Font, backBrush, txtPoint);
txtPoint.Offset(-1, -1);  // 绘制下背景文字
e.Graphics.DrawString(this.Text, this.Font, backBrush, txtPoint);
txtPoint.Offset(0, 2);  // 绘制上背景文字
e.Graphics.DrawString(this.Text, this.Font, backBrush, txtPoint);
txtPoint.Offset(0, -1);  // 定位点归位// 绘制前景文字
e.Graphics.DrawString(this.Text, this.Font, foreBrush, txtPoint);

下面请欣赏效果

结语

很多时候,如果不便于解决问题,那么换一种解决思路不失为一个好的开始。遇到问题,不一定需要完全跟着问题走。有时候跳出问题表象的禁锢,反而能获得更加宽广的视野。

非典型文字描边效果的实现方法相关推荐

  1. html5中外描边怎么写,CSS3实现文字描边的2种方法(小结)

    问题 最近遇到一个需求,需要实现文字的描边效果,如下图 解决方法一 首先想到去看CSS3有没有什么属性可以实现,后来被我找到了text-stroke 该属性是一个复合属性,可以设置文字宽度和文字描边颜 ...

  2. html文字加描边效果,CSS3实现文字描边效果

    以前想实现文字描边效果只能用PS制作图片,现在我们可以用CSS3就可以实现文字描边效果其实,不用图片还可以文字描边哦,下面看青岛星网的实现方式. CSS3实现文字描边效果,这里主要用到text-sha ...

  3. CSS3文字描边效果

    CSS3 中有text-stroke属性,加上-webkit-前缀兼容性也还不错,但是只有在字体很大的时候才能看到描边效果,如果字体比较小,描边颜色会遮住文字本身颜色. 上图为黑色字体白色描边,字体颜 ...

  4. CSS3实现文字描边的2种方法

    CSS3实现文字描边的2种方法 解决方法一 .demo {color: mistyrose;text-align: center;font-family: Verdana;font-size: 30p ...

  5. 文字描边_如何在网页里实现文字描边效果

    文字描边 想要在网页里实现文本描边效果,在以前只能使用Photoshop等来实现,但现在只需要一个text-stroke属性,即可轻松做到文本描边,渐变文本描边,甚至图片文本描边. 01 语法 tex ...

  6. html中文字描边效果代码,css如何设置文字描边效果?

    想要使用CSS给文字添加描边效果,主要有两种方法:使用text-stroke属性或text-shadow属性. 方法1:使用text-shadow属性 text-shadow属性用于向文本添加字体边框 ...

  7. Android文字描边效果实现

    前言 最近项目用到了文字的描边效果,本来以为是个很简单的东西,从网上搜了不少实现,但实际做出来的效果却很难达到要求,这里简单记录自己的实现方法. 实现接口 Android二维绘制的Paint画笔工具有 ...

  8. 移除echarts散点图默认的文字描边效果

    问题 今天在使用js开发数据大屏时,pm给我提了一个bug,散点图的markArea和markLine的字体放大会失真,缩小看不清楚,我想着这简单的不能再简单了,于是开始了我痛苦地1.5h之旅 采用e ...

  9. html文字破碎特效,AE怎么制作破碎文字特效? ae文字破碎效果的制作方法

    本例主要讲解利用[碎片]特效制作破碎文字.我现在教你如何制作破碎文字. 1.打开Adobe After Effects CC 2015. 2.在弹出的"欢迎"使用Adobe Aft ...

最新文章

  1. 网站预加载进度条的实现
  2. Python 学习之元组
  3. coreboot学习10:coreboot第一阶段学习小结
  4. java 父类构造函数_Java基础系列 - 子类继承父类,调用父类的构造函数
  5. python多线程运用
  6. Digits of Factorial LightOJ - 1045(数学题?)
  7. L1-065 嫑废话上代码 (5 分)-PAT 团体程序设计天梯赛 GPLT
  8. pcs7组态虚拟机中的服务器,用虚拟机做PCS7时,无法设置固定的IP地址-工业支持中心-西门子中国...
  9. SPSS实现游程检验
  10. C#+sqlserve实现登陆界面
  11. 为大众而写的程序员小说——从《简单易懂的现代魔法》说开去。
  12. STOP:0x0000007E蓝屏软件故障处理一例
  13. gets和puts基本用法。
  14. cdr怎么抠图轮廓线条_CDR怎么抠图?CorelDRAW快速抠图方法
  15. 【PR学习笔记】PR学习笔记之PR快捷键
  16. JS打印表格时边框缺失问题
  17. Xbox 360抢鲜测评
  18. Mysql5.7 You can't specify target table 'table' for update in FROM clause
  19. 城市公共交通规划掌握内容
  20. 实时系统vxWorks - 虚拟机环境搭建(修复)

热门文章

  1. C2039 Error: WriteHuge : is not a member of CFile
  2. 理解JavaScript设计模式
  3. app中我的页面头像及背景效果实现
  4. SpringBoot实现发送QQ邮箱验证码
  5. Python小技巧:将 1M 图片优化压缩到 1024kb,简单到手到擒来
  6. 心存希望,幸福就会靠近你;心存梦想,机遇就会笼罩你;心存坚持,快乐就会常伴你;心存善念,阳光就会照耀你;心存美丽,温暖就会围绕你;心存他人,真情就会回报你;心存感恩,贵人就会青睐你。
  7. 2022数学建模美赛B题详细思路获取
  8. centos查看磁盘转速_Centos磁盘读写检测进行性能判断
  9. 时钟(CLOCK)置换算法
  10. Redis-NoSql结构化数据库