任意矢量图像的亚像素渲染(Haarmony LCD)

子像素渲染( Wiki )是一种通过基于屏幕属性渲染像素来提高LCD或OLED显示器可见分辨率的方法。 事实是,屏幕的每个像素实际上由单独的红色,绿色和蓝色子像素组成。


在一篇博文中,我想讨论一下Haarmony LCD方法,该方法在最新版本的freetype中使用,以及如何使其适应于任意矢量图像和亚像素配置。



源图像是什么样的


摄影,很难传达出好处。 为了进行比较,您可以看下面的图片。 如果像素配置之一与您的显示器相同,则差异应该很大。



U•HODL的创建者向我提出了一项建议,以使其设备适应亚像素渲染。 该设备是一个带有0.96英寸OLED屏幕(120×180)的微型加密货币钱包。他们有一个博客 (英语),描述了他们如何注重便利性以及如何从小屏幕上挤出最大的空间。因此,他们需要图标和文本的SPR。


背景(ClearType)


在Internet上,您可以找到Windows中使用的ClearType机制的描述。 我认为,最好的描述是在grc.com上 。 然后对那些对细节不感兴趣的人进行简短介绍。 ClearType包含两个步骤:


1.文字的宽度是原始文字的三倍


每个渲染像素负责一个颜色子像素:



如果仅在屏幕上显示此类文本,则会在字母的边缘看到色差:



2.滤镜更改相邻像素的颜色(但不更改亮度)


并恢复本地色彩平衡:



此方法有几个缺点:


  1. 如何将其应用于彩色图像尚不清楚。
  2. 如果子像素不在同一行,则滤镜很复杂(屏幕配置会稍低一些)
  3. 过滤器本身受Microsoft专利保护。 也许有人记得默认情况下,由于专利的原因,在早期版本的自由类型亚像素渲染中默认情况下被禁用。

Haarmony LCD


Haarmony LCD算法就在这里。 除了其作者来信外 ,在Internet上几乎没有有关该算法的信息。 但是,算法本身很简单直观。 必须使用等于子像素偏移的偏移量渲染文本3次,并添加颜色通道。


假设您具有此配置的矩阵:



您需要渲染并添加:


  1. 蓝色通道的水平偏移为-0.25像素
  2. 绿色通道水平偏移+0.25像素
  3. 红色通道的垂直偏移为+0.5像素

渲染方案将是这样的。



SVG


最简单的方法是渲染SVG图像。 只需将viewBox偏置3次即可,替换为:


viewBox="0 0 120 180" 


 viewBox="0.25 0 120.25 180" 

呈现图标的示例:



图片:



矩阵配置


细心的读者可以替换图像上的彩色象棋。 这是由于以下事实:要为其开发算法的显示器大约具有以下矩阵:



即,偶数和奇数行上的子像素被镜像。 在这种情况下,足以使用两种不同的配置进行渲染,并从一个图像中获取偶数行,而从另一图像中获取奇数行。


附言 mcufont


如果需要在mcufont中使用亚像素渲染(用于在微控制器上渲染字体的库),则需要修补编码器/ freetype_import.cc并将Haarmony LCD设置为FT_Render_Glyph(face-> glyph,FT_RENDER_MODE_LCD) 。 在文本结尾处,请不要忘记字母的宽度将比所需宽度大3倍。

Source: https://habr.com/ru/post/zh-CN474876/


All Articles