向使用 GDI+ 绘制的图像添加文本
Posted
技术标签:
【中文标题】向使用 GDI+ 绘制的图像添加文本【英文标题】:Adding Text to Image Drawn with GDI+ 【发布时间】:2022-01-17 06:59:28 【问题描述】:我正在使用计时器和图片框显示图像。这些图像似乎是相互叠加而不是显示一个,然后删除那个,然后加载另一个。
在显示图像时,我想在图像上叠加文字。
这是我用来创建图像和文本的代码
Dim fname As String = (Actually an array in images(jpg) that display with timer)
Dim bm As New Bitmap(fname)
PicBox.Image = bm
findex -= 1 (index of image array)
Dim g As Graphics = PicBox.CreateGraphics
g.DrawImage(bm, 300, 10)
g.DrawString("Kishman Tukus", New Font("Arial", 24, FontStyle.Bold), Brushes.Green, 400, 100)
g.ResetTransform() '
g.Dispose()
我需要使用计时器一次在图片框中显示一个图像,并且我需要叠加 图片上也有文字。
有人可以帮助我阻止图像添加到图片框中,而不是一次显示一个吗? 或者更好的是,根本不使用 PictureBox,只显示带有文本覆盖的图像? 无论如何,我需要停止记忆流血。 谢谢你
【问题讨论】:
从代码中不清楚您真正想要实现的目标。设置 PictureBox 的 Image 属性将导致它根据 PictureBox 上的其他属性(SizeMode 等)在 PictureBox 内绘制该图像。您首先要说,“嘿 PictureBox,请在每次重绘时使用我在表单设计器或其他代码中分配的设置为自己绘制此图像。”然后你说,“哦,但就这一次,我想在你的特定位置画同样的图像,并在上面画一些文字。”请注意,如果需要重新绘制,这将变得更加丑陋 在您的示例代码中,它是同一张图像,但您似乎在描述相互绘制的不同图像,在我看来,这表明您没有向我们展示真正的代码。 【参考方案1】:我认为如何加载图像很重要。您真的每次显示时都按文件名加载每个图像吗?这是误导性的,正如你提到的,有一个数组。区别在于您保留对这些图像的引用并且您正在修改每一个。请记住,这是一个引用类型,因此原始项目会被修改。因此,您最终会反复将文本覆盖在自身之上。具有讽刺意味的是,如果您确实在每个刻度上都加载了图像,那么您实际上就不会遇到这个问题 :)
我按照您所拥有的(我认为)制作了一些东西,我们使用 Object.Clone 在内存中制作每个位图的副本,您可以在不修改原始图像的情况下进行修改。
Private images As New List(Of Bitmap)()
Dim findex As Integer = 0
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Dim bmCopy = DirectCast(images(findex).Clone(), Bitmap)
Using g As Graphics = Graphics.FromImage(bmCopy)
g.DrawString(Guid.NewGuid().ToString(), New Font("Arial", 24, FontStyle.Bold), Brushes.Green, 400, 100)
End Using
PicBox.Image = bmCopy
findex = (findex + 1) Mod images.Count()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
images.Add(My.Resources.Image1)
images.Add(My.Resources.Image2)
Timer1.Interval = 1000
Timer1.Enabled = True
End Sub
没有内存泄漏。您可以检查内存增加,但 GC 最终会将其清除。
【讨论】:
【参考方案2】:我希望看到更多类似的东西:
Dim bm As New Bitmap(fname)
Using g As Graphics = Graphics.FromImage(bm)
g.DrawString("Kishman Tukus", New Font("Arial", 24, FontStyle.Bold), Brushes.Green, 400, 100)
End Using
PicBox.Image = bm
【讨论】:
以上是关于向使用 GDI+ 绘制的图像添加文本的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 TextRenderer 绘制多种大小的文本对齐? [复制]
使用 GDI+,沿公共基线对齐文本(以几种不同字体绘制)的最简单方法是啥?
DirectWrite GDI 互操作:使用“IDWriteFontFace”绘制文本的简单方法