1

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

查看代码片段可能更容易。

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

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

然后我们开始讨论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

Eveything 工作得非常好 - 文本应用在正确的位置和正确的字体等,尽管第二行的重量似乎要轻得多。

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

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

我的形象 - 第二行明显更薄......

更新

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

4

1 回答 1

1

好的-过去几天这一直让我发疯。

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

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

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

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

因此,就在添加字符串之前,我只是简单地放置了gPath.Reset()- 这确保了通过的图形路径 -ByRef被重置以供下一个要添加的字符串。

于 2013-05-30T17:58:43.997 回答