Vb.net 在列表中保存位图总是返回相同的图像

Vb.net 在列表中保存位图总是返回相同的图像,vb.net,visual-studio-2010,visual-studio-2012,Vb.net,Visual Studio 2010,Visual Studio 2012,我正在为图像编辑器创建一个CTRL+Z undo功能,每次单击屏幕都会用以下代码保存图像: Private Sub SaveMap(ByVal sender As Object, ByVal e As EventArgs) Handles PictureBox1.Click Dim asd As New Bitmap(Form6.PictureBox1.Image) GlobalVariables.BackUp.Add(Form6.PictureBox1.Image) a

我正在为图像编辑器创建一个
CTRL+Z undo
功能,每次单击屏幕都会用以下代码保存图像:

Private Sub SaveMap(ByVal sender As Object, ByVal e As EventArgs) Handles PictureBox1.Click
    Dim asd As New Bitmap(Form6.PictureBox1.Image)
    GlobalVariables.BackUp.Add(Form6.PictureBox1.Image)
    asd.Dispose()
End Sub
每次用户按下
CTRL+Z
时,都会执行此代码

Private Sub Picturebox1_KeyPress(ByVal sender As Object, ByVal e As KeyEventArgs) Handles Me.KeyDown
    If e.KeyCode = Keys.Z And e.Control Then
        GlobalVariables.BackUp.RemoveAt(GlobalVariables.BackUp.Count - 1)
        Form6.PictureBox1.Image = New Bitmap(GlobalVariables.BackUp.Last)
        Form6.PictureBox1.Refresh()
    End If
End Sub
但是看到我保存在
公共共享备份中的所有位图作为新列表(位图)
都是相同的

因为无论我使用
GlobalVariables.BackUp.Item()
返回哪个索引,它们都返回完全相同的映像


为什么列表上的位图会被替换,而不是一个接一个地添加?

您保存的不是新位图,而是对picturebox.image的引用。作为参考,它将在
PictureBox.Image
更改时更改。这将通过克隆当前显示的内容将新图像保存到列表中:

Private Sub SaveMap(ByVal sender ...
    Dim bmp As Bitmap
    bmp = Form6.PictureBox1.Image.Clone   ' clone the image

    GlobalVariables.BackUp.Add(bmp)       ' save the copy

    ' dispose of it later when you remove it from the list
End Sub

您不是在列表中保存位图,而是对picturebox图像的引用。当该图像更改时,您保存的内容也会更改,因为它只是一个参考。尝试了3种不同的方法:
Dim asd As New Bitmap(Form6.PictureBox1.image.Clone)
给出错误“如果不进行缩小转换,则无法调用New”,
Dim asd As Bitmap asd=Form6.PictureBox1.Image.Clone
在我尝试从列表中获取时,给我一个空对象错误,您给我的代码说“没有可访问的新对象接受此数量的参数”,怎么了?抱歉,复制错误;您不需要在bmp声明中使用
New
-
Clone
将创建一个新的。您需要检查PicBox中是否有图像,以避免出现NullReferenceException我将代码放在try/catch中,它会给我以下错误:发生了什么?不确定,我不会说那种语言来知道哪一行,但这与您原来的问题不同。我不知道图像存储的内容/方式-看起来不仅仅是一个
列表(位图)
,它没有
Last
道具;哦,我明白了,谢谢你的信息,你把我放在了正确的位置,现在我会发现还有什么不对:)谢谢