首页 新闻 搜索 专区 学院

WPF怎么实现清晰像素级文字描边,效果如图

0
悬赏园豆:20 [已解决问题] 解决于 2022-04-26 10:00

WPF怎么实现清晰像素级文字描边,效果如图;

请提供实现代码阅览连接.

WPF
HotSky的主页 HotSky | 菜鸟二级 | 园豆:203
提问于:2021-05-03 14:41
< >
分享
最佳答案
0

是图片呢,还是WPF的字体描边。
如果是字体描边,可以这样实现:

drawingContext.DrawGeometry(Fill, new Pen(Stroke, StrokeThickness), m_TextGeometry);

是想要这种效果么,很早之前刚好写过一篇博文,看看是否满足需求。

WPF自定义空心文字

收获园豆:20
楚人Leo | 小虾三级 |园豆:803 | 2021-07-02 10:34

这种不行,你的这个字体调小后看就发现是模糊的,我想要不模糊的。

HotSky | 园豆:203 (菜鸟二级) | 2021-07-02 10:36

你的描边用黑色,但是你用放大镜看会发现有夹杂着不同深度的灰色;

而我给的参考图里只有黑色,而且永远只占一个像素点。

HotSky | 园豆:203 (菜鸟二级) | 2021-07-02 10:43

@HotSky:

楚人Leo | 园豆:803 (小虾三级) | 2021-07-02 11:06

@楚人Leo: 是放大,不是字体调大,

HotSky | 园豆:203 (菜鸟二级) | 2021-07-02 11:09

@楚人Leo: 你的这个放大后看是模糊的,而且不管字体多大,我只需要1像素的描边就行。

HotSky | 园豆:203 (菜鸟二级) | 2021-07-02 11:15

@HotSky:

这是代码:

<panAndZoom:ZoomBorder Name="ZoomBorder"
                       HorizontalAlignment="Stretch"
                       VerticalAlignment="Stretch"
                       Background="NavajoWhite"
                       ClipToBounds="True"
                       Focusable="True"
                       Stretch="None"
                       ZoomSpeed="1.2">
    <outlinedText:OutlinedText HorizontalAlignment="Center"
                               VerticalAlignment="Center"
                               Bold="True"
                               Fill="White"
                               Font="Consolas"
                               FontSize="16"
                               Italic="True"
                               Stroke="Black"
                               StrokeThickness="1"
                               Text="OutlinedText" />
</panAndZoom:ZoomBorder>

这是效果图,16号的字体,使用TranslateTransform进行矩阵变换放大字体,和字号没关系的。

文字生成几何图形使用的是FormattedText的BuildGeometry方法。将几何图形渲染绘制使用的DrawingContext 的DrawGeometry方法以及Pen实例。

这里重点说明FormattedText构造函数的pixelsPerDip参数,按“密度无关像素”单位计算的像素值,等效于比例因子。 例如,如果屏幕的 DPI 为 120(或 1.25,因为 120/96 = 1.25),那么“密度无关像素”值为 1.25。 DPI 是 WPF 采用的独立于设备分辨率和 DPI 的度量单位。(Windows上一般默认是96 dpi 作为100% 的缩放比率)

如果用放大镜看像素没对齐,则需要将SnapsToDevicePixels属性设为True。

关于创建带轮廓的文本,MSDN上有详细描述。

最后有必要说明一下,基本上(认知有限,不敢说任何)矢量几何图形渲染,最后都是变成栅格图像,以矩阵形式排列,然后绘制到屏幕上。

平时说的抗锯齿、放大不模糊,都是实时渲染算法功劳。不管是GDI+还是Direct2D,如果只是针对渲染后的单个栅格图像放大都会模糊。

你要是有更好的办法,欢迎分享!

楚人Leo | 园豆:803 (小虾三级) | 2021-07-02 13:28

@楚人Leo: 我没有说明白,我说的放大是对生成的文字用截图软件(比如qq截图)截图,然后对图片放大,放大后看到的颜色不能出现混合色。比如你拿我的那个参考图放大后,描边黑色还是黑色,不会出现夹杂各种深度的灰色。

HotSky | 园豆:203 (菜鸟二级) | 2021-07-02 13:37

@HotSky: 那应该是抗锯齿生成的过渡色。

楚人Leo | 园豆:803 (小虾三级) | 2021-07-02 14:36
其他回答(1)
0

这是文字还是图片?图片的话,opencv读取,进行二值化,直接描边。

风徐徐 | 园豆:36 (初学一级) | 2021-05-06 17:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册