Vb.net 从PictureBox获取位图-对象的新实例
我有一个“完美”的工作代码,可以将屏幕的一部分放入方形图片盒中。Vb.net 从PictureBox获取位图-对象的新实例,vb.net,winforms,graphics,picturebox,Vb.net,Winforms,Graphics,Picturebox,我有一个“完美”的工作代码,可以将屏幕的一部分放入方形图片盒中。 我有一个“完美无瑕”的工作代码,可以用笔在画框上画画。 我完全不明白,为什么我不能让笔在图片盒中的位图上画画-它只在灰色背景上画画。 该解决方案(也按照谷歌的说法)看似简单,但任何试图从PictureBox获取gg图形的方法都会导致(“创建表单时出错。有关详细信息,请参阅Exception.InnerException。错误为:值不能为null。 参数名称:image和“使用'New'关键字创建对象的新实例…”) 我认为问题在于我
我有一个“完美无瑕”的工作代码,可以用笔在画框上画画。
我完全不明白,为什么我不能让笔在图片盒中的位图上画画-它只在灰色背景上画画。
该解决方案(也按照谷歌的说法)看似简单,但任何试图从PictureBox获取gg图形的方法都会导致(“创建表单时出错。有关详细信息,请参阅Exception.InnerException。错误为:值不能为null。 参数名称:image和“使用'New'关键字创建对象的新实例…”) 我认为问题在于我将位图定义为sub之外的私有位图,但我无法理解正确的概念
Private bit As New System.Drawing.Bitmap(250, 250)
Private gg As Graphics = Graphics.FromImage(Me.PictureBox1.Image)
' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
' ^^^^^^^^^^ HERE IS THE PROBLEM ^^^^^^^^^^^^^^^^^^^^^^
' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Private br As New Pen(Color.Red)
Private dwn As Boolean
Private lst As Point
Private firstrun As Boolean = True
Dim Tloustka As Integer = 10
Dim Barva As Integer
Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
'gg = Graphics.FromImage(Me.PictureBox1.Image)
dwn = True
End Sub
Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
If dwn = True Then
Dim s As Integer
Dim xy As Point
Dim br2 As New SolidBrush(Color.FromName("White"))
s = Tloustka
br.Color = Color.FromName("White")
br.Width = Tloustka
xy.X = e.X
xy.Y = e.Y
If firstrun = True Then
lst = xy
firstrun = False
End If
gg.FillEllipse(br2, xy.X - CLng(s / 2), xy.Y - CLng(s / 2), s, s)
gg.DrawLine(br, lst, xy)
lst = xy
PictureBox1.Image = bit
End If
End Sub
etc. etc. etc.
不要存储图形对象。当您需要绘制某些内容时,只需从位图创建它:
Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
If dwn = True Then
Using g As Graphics = Graphics.FromImage(bit)
Dim s As Integer
Dim xy As Point
Using br2 As New SolidBrush(Color.FromName("White"))
s = Tloustka
br.Color = Color.FromName("White")
br.Width = Tloustka
xy.X = e.X
xy.Y = e.Y
If firstrun = True Then
lst = xy
firstrun = False
End If
g.FillEllipse(br2, xy.X - CLng(s / 2), xy.Y - CLng(s / 2), s, s)
g.DrawLine(br, lst, xy)
End Using
End Using
lst = xy
PictureBox1.Invalidate()
End If
End Sub
然后使用PictureBox的paint事件显示图像:
Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
e.Graphics.DrawImage(bit, Point.Empty)
End Sub
请务必处理好图形对象。以上所有代码似乎都有点太复杂了。就我而言,最简单的方法是如下所示: 将bm设置为位图 带PictureBox1 bm=新位图(.Width,.Height) PictureBox1.DrawToBitmap(bm,新矩形(0,0,、宽度和高度)) 以 /印刷代码/ 处置
备注:任何控件都可以绘制到位图。删除“位”。完成绘制后,调用PictureBox1.Invalidate(),以便它知道需要重新绘制图像。谢谢,这是一个完美的答案,它完全解决了我的问题!祝您有个美好的一天!