【问题标题】:Drawing.Font appears thinner with each useDrawing.Font 每次使用都会变细
【发布时间】:2013-05-31 01:58:43
【问题描述】:

我正在向现有图像动态添加文本。我发现奇怪的是,每次使用我使用的钢笔/画笔/字体时,文字似乎变得更细了。

可能更容易看到代码的sn-p。

下面的代码中使用了一些变量,但没有在下面的代码中声明 - 这是一大段代码的 sn-p,其中大部分与问题无关。这部分就是正文的写法。

最终所有资源都是使用块创建的。

然后我们开始使用AddTextToGraphicsPath() 方法 - 如下所示。这只是将文本应用于路径。

Using fiTextFont As New Font("Arial"), FontStyle.Bold)
Using brush As Brush = New SolidBrush(ColorTranslator.FromHtml("#000000"))
    Using pen As Pen = New Pen(ColorTranslator.FromHtml("transparent"))
        Using oImage As Image = Image.FromFile(fName)
          Using grfx As Graphics = Graphics.FromImage(oImage)
            For i As Integer = 0 To loopCount
                Using gPath As GraphicsPath = New GraphicsPath()
                    grfx.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
                    grfx.TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit
                    grfx.CompositingQuality = CompositingQuality.HighQuality
                    Dim sFormat As New StringFormat(StringFormat.GenericTypographic)
                    sFormat.Alignment = StringAlignment.Center
                    Dim textSplit() As String = fiText.Split(vbCrLf)
                    AddTextToGraphicsPath(gPath, grfx, textSplit(0).Replace(vbLf, ""), fiTextFont, fxPos, fyPos, pen, brush, Nothing, sFormat)
                    AddTextToGraphicsPath(gPath, grfx, textSplit(1).Replace(vbLf, ""), fiTextFont, fxPos, fyPos + fiTextFont.Size - 2, pen, brush, Nothing, sFormat)
                End Using
            Next
          End Using
        End Using
    End Using
End Using

结束使用

这是将文本应用到路径的方法。

Private Shared Sub AddTextToGraphicsPath(ByRef gPath As GraphicsPath, ByRef grfx As Graphics, ByRef text As String, ByRef font As Font, ByRef x As Single, ByRef y As Single, ByRef pen As Pen, ByRef brush As Brush, ByRef matrix As Matrix, ByRef sFormat As StringFormat)
    gPath.AddString(text, font.FontFamily, font.Style, font.Size, New PointF(x, y), sFormat)
    If (matrix IsNot Nothing) Then gPath.Transform(matrix)
    grfx.DrawPath(pen, gPath)
    grfx.FillPath(brush, gPath)
End Sub

一切都很好——文本应用在正确的位置和正确的字体等,尽管第二行似乎要轻得多。

如果我将字体设置为Bold,第一行是粗体,第二行“似乎”是常规的,尽管单步执行代码我可以看到字体没有改变。

生成的图像看起来有点像下面的示例:

更新

我现在已经尝试了相同的代码,但是为每个对 AddTestToGraphicsPath 的调用创建了新的字体、笔、画笔,它仍然执行相同的操作;所以想知道这是否是 GraphicsPath.AddString() 的问题?

【问题讨论】:

    标签: asp.net vb.net system.drawing


    【解决方案1】:

    好的 - 这几天让我发疯了。

    通常,在发布此问题后的一个小时左右,我设法解决了问题。

    在应用我的字符串之前,我需要对 GraphicsPath 执行重置。

    不是 100% 确定为什么这会导致问题,尽管它肯定解决了问题。

    我相信它发生的原因是在添加第二个字符串时,来自第一个路径的字符串路径数据仍然存在。然后grfx.FillPath 方法对第一个应用两次填充。

    所以在添加字符串之前,我只是简单地输入了gPath.Reset() - 这确保了由ByRef 传递的图形路径被重置以供下一个要添加的字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 2012-11-29
      相关资源
      最近更新 更多