PictureBox2.Image=PictureBox1.Image似乎在链接框而不是复制图像



问题

我有一个简单的表格,有2个图片盒

我允许用户在PictureBox1上绘制。当我单击表单上的Button时,我想在PictureBox1中捕获图像,并将其存储在>PictureBox2

问题是,如果我加上一行:PictureBox2.Image=PictureBox1.ImagePictureBox1的任何更新都会立即反映在PictureBox2中?!?

我只想在PictureBox1中捕捉当时的图像,这样我就可以使用它来"撤消">

技术

这是一个使用Visual Studio 2019预览版的Visual Basic.Net 4.7.2中的Windows窗体应用程序

代码

Public Class Form1
Dim drawMouseDown = False ' Set initial mouse state to not clicked
Dim drawMyBrush As New Pen(Brushes.White, 20) 'Set up the Brush
Public drawCanvas As New Bitmap(245, 352) 'Set up Bitmap Canvas
Private Sub btn_Color_Yellow_Click(sender As Object, e As EventArgs) Handles btn_Color_Yellow.Click
drawMyBrush.Brush = Brushes.Yellow
drawMyBrush.Width = 20
End Sub
Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
drawMouseDown = True
End Sub
Private Sub PictureBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp
drawMouseDown = False
End Sub
Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
Dim g As Graphics = Graphics.FromImage(drawCanvas)
Static coord As New Point
If drawMouseDown Then
g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
drawMyBrush.StartCap = Drawing2D.LineCap.Round
drawMyBrush.EndCap = Drawing2D.LineCap.Round
g.DrawLine(drawMyBrush, coord.X, coord.Y, e.X, e.Y)
g.Dispose()
PictureBox1.Image = drawCanvas
Me.Refresh()
End If
coord = e.Location
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
PictureBox2.Image = PictureBox1.Image 'Why does this not just update the PicBox2 image once?!? (or only when the Button is clicked)
End Sub
End Class

期望

当点击按钮1时,我希望PictureBox2包含PictureBox1image,当我继续在ictureBox1上绘制时,我不希望它在用户在另一个上绘制时继续更新PictureBox2

正如您所怀疑的,PictureBox2.Image = PictureBox1.Image使前者成为后者的引用。

相反,你可以做的是克隆图像:

PictureBox2.Image = DirectCast(PictureBox1.Image.Clone(), Image)

因为您正在将PictureBox2的Image属性引用到PictureBox1.Image。因此,当它们都指向同一个引用时,对PictureBox的任何一个Image属性的任何更改都会影响另一个的。

为了避免这种情况,请在PictureBox1.Image的基础上创建一个新的位图对象实例,并将其设置为PictureBox2.Image:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
PictureBox2.Image = New Bitmap(PictureBox1.Image)
End Sub

最新更新