【问题标题】:Text is blurred when transformed in WPF在 WPF 中转换时文本模糊
【发布时间】:2014-05-22 03:28:23
【问题描述】:

我正在使用DrawingContext.DrawTextDrawingContext.PushTransfrom 在 WPF 的可视层上创建旋转文本,但如下图所示,旋转后的文本在图像的某些区域相当模糊..

我可以使用任何选项来改进这一点吗? Arial 字体用于文本。

public class BeamTextDrawing : FrameworkElement
{
    private readonly VisualCollection _visuals;
    public BeamTextDrawing(double scale)
    {
        if (scale <= 0)
        {
            scale = 1;
        }
        var typeface = Settings.BeamTextTypeface;
        var cultureinfo = Settings.CultureInfo;
        var flowdirection = Settings.FlowDirection;
        var textsize = Settings.BeamTextSize / scale;
        var beamtextcolor = Settings.InPlanBeamTextColor;

        _visuals = new VisualCollection(this);

        foreach (var beam in Building.BeamsInTheElevation)
        {
            var drawingVisual = new DrawingVisual();
            using (var dc = drawingVisual.RenderOpen())
            {
                var text = Convert.ToString(beam.Section.Id);
                //text = scale.ToString();
                var ft = new FormattedText(text, cultureinfo, flowdirection,
                                            typeface, textsize, beamtextcolor)
                {
                    TextAlignment = TextAlignment.Center
                };

                var x1 = beam.ConnectivityLine.I.X;
                var y1 = beam.ConnectivityLine.I.Y;
                var x2 = beam.ConnectivityLine.J.X;
                var y2 = beam.ConnectivityLine.J.Y;

                var v1 = new Point(x2, y2) - new Point(x1, y1);
                var v2 = new Vector(1, 0);

                var hwidth = textsize;
                var l = Geometrics.GetOffset(x1, y1, x2, y2, hwidth + 5/scale);

                var angle = Vector.AngleBetween(v1, v2);
                var x = 0.5 * (l.X1 + l.X2);
                var y = 0.5 * (l.Y1 + l.Y2);

                var r = new RotateTransform(angle, x, SelectableModel.FlipYAxis(y));
                dc.PushTransform(r);
                dc.DrawText(ft, SelectableModel.FlipYAxis(x, y));
            }
            _visuals.Add(drawingVisual);
        }
    }

    protected override Visual GetVisualChild(int index)
    {
        return _visuals[index];
    }

    protected override int VisualChildrenCount
    {
        get
        {
            return _visuals.Count;
        }
    }
}

更新:

这是使用此代码后的图像:

TextOptions.SetTextFormattingMode(this, TextFormattingMode.Display);

我仍然得到模糊的结果。查看图片下方的中间横梁文字。

【问题讨论】:

  • 你试过 TextOptions.TextHintingMode="Animated" RenderOptions.EdgeMode="Aliased" 吗?
  • @HeenaPatil 是的,没有改进:(

标签: c# wpf xaml


【解决方案1】:

查看这篇文章 - Pixel Snapping in WPF Applications

由于 WPF 使用与设备无关的像素,因此在进行转换时,由于抗锯齿,它可以创建不规则的边缘渲染。像素捕捉是一种抑制这些视觉伪影的方法,方法是对视觉对象的几何图形应用小偏移,以将几何图形与设备像素对齐。

将您的 UI 元素的 SnapsToDevicePixels 属性设置为“True”应该能够解决您的问题。

【讨论】:

  • 感谢 ramb00,我已经应用了所有这些方法,但结果是一样的。我已经读到这个问题在 WPF 4.0 中得到了修复,但我使用的是 VS2012,问题仍然存在。
猜你喜欢
  • 2014-05-21
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
相关资源
最近更新 更多