我正在动态地将文字添加到现有图像中。我发现奇怪的是,每次使用我使用的笔/笔/字体时,文字看起来都会变薄。
可能更容易看到代码片段。
下面的代码中使用了一些变量,这些变量未在下面的代码中声明 - 这是一大块代码的片段,其中大部分代码与问题无关。这部分就是写文本的内容。
最终所有资源都是使用块创建的。
然后我们开始使用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()的问题?
答案 0 :(得分:1)
好的 - 过去几天这让我很生气。
通常,在发布此问题的一小时左右后,我设法解决了这个问题。
我需要在应用字符串之前对GraphicsPath
执行重置。
不是100%确定为什么这会导致问题,尽管它确实解决了问题。
我相信它发生的原因是在添加第二个字符串时,第一个路径中的字符串路径数据仍然存在。 grfx.FillPath
方法然后将填充两次应用于第一个。
所以在添加字符串之前我只需要放置gPath.Reset()
- 这可以确保重置ByRef
传递的图形路径以便添加下一个字符串。