我正在向现有图像动态添加文本。我发现奇怪的是,每次使用我正在使用的钢笔/画笔/字体,文本似乎变得更薄。
查看代码片段可能更容易。
下面的代码中使用了一些变量,这些变量没有在下面的代码中声明 - 这是一大段代码的片段,其中大部分与问题无关。这部分是写正文的部分。
最终,所有资源都是使用块创建的。
然后我们开始讨论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() 的问题?