2015-01-07 51 views
1

我不知道,如果它的时间已晚,但我已经是以下阵列上For循环:For Loop工作不正常,或者发生错误。当工作条件颠倒

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim pboxes() As PictureBox = {picMainImage, picImage2, picImage3, picImage4} 

    For i As Integer = 0 To pboxes.Count - 1 
     If pboxes(i).Image Is My.Resources.list Then 
      pboxes(i).Image = Nothing 
     End If 
    Next 
End Sub 

环路应该检查是否有任何的图片框在数组有一个名为List的Image存储在它们的Resources文件夹中。如果是,请将图像设置为无。但是,我运行它并没有任何反应,没有错误,没有任何反应。

所以我扭转我的For循环如下,看看会发生什么:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim pboxes() As PictureBox = {picMainImage, picImage2, picImage3, picImage4} 

    For i As Integer = 0 To pboxes.Count - 1 
     If pboxes(i).Image Is Nothing Then 
      pboxes(i).Image = My.Resources.list 
     End If 
    Next 
End Sub 

这工作,但不是我想要的,我想要的正好相反。

我在这里做错了什么?

+0

什么是My.Resources.list? – Bharadwaj

+0

@Bharadwaj My.Resources.List是我保存在我的资源文件中的图像 –

+2

每当您访问资源中的图像时,都会创建一个**副本**。因此,您的PictureBox中的图像永远不会“等于”资源中的图像。我建议你以其他方式跟踪PictureBox中的图像。一旦可能性将简单的字符串值放入PictureBox的Tag属性中。 –

回答

1

一种选择是,如果你在框中设置的图像编程,设置My.Resources.list通过一个全局变量引用,即Public pbList = My.Resources.list

然后,当您最初设置的画面,使用该变量,所以:picMainImage.Image = pbList

最后,在If声明,则应能够检查If pboxes(i) is pbList Then...

一旦它变成一个变量,它似乎变成静态的,因此无论你在哪里使用它,它都将是一样的。

编辑:我用了几个月前的一些实际代码:在子

If imgpath <> "" Then 
    Me.lblImg.ImageLocation = imgpath 
Else 
    Me.lblImg.ImageLocation = Nothing 
    Me.lblImg.Image = pbimage 
End If 

在模块(外分)

Public pbimage As System.Drawing.Image = My.Resources.placeholder 

然后再这是我使用的所有图片没有问题(它是我单击图像时运行的功能 - 如果它的占位符,那么您可以浏览图像并将其保存到数据文件夹,否则它会执行n没有)

Private Sub changeImg(sender As Object, e As MouseEventArgs) Handles {ALL YOUR IMAGES}.Click 
    If TypeOf sender Is PictureBox Then 
     If DirectCast(sender, PictureBox).Image Is pbimage Then 
      Dim ofd As New OpenFileDialog 
      ofd.Title = "Please select image" 
      ofd.Filter = "Image Files|*.jpg" 
      If ofd.ShowDialog() = Windows.Forms.DialogResult.OK Then 
       Dim rn As New Random 
       Dim r As Long = rn.Next(111111, 999999) 
       Dim newfilename As String = My.Settings.dataPath & r.ToString & Format(Now, "ddmmyy") & ".jpg" 
       Try 
        FileCopy(ofd.FileName, newfilename) 
        DirectCast(sender, PictureBox).ImageLocation = newfilename 
       Catch ex As Exception 
        MessageBox.Show("Check permissions to the Data folder", "Permissions error") 
       End Try 
      End If     
     End If 
    End If 
End Sub 
+0

你测试过了吗?请用一些示例代码更新您的答案。我最初想要尝试这个,但它不起作用。我很好奇看到这个工作,因为它比比较像素更简单。 –

+0

我在几个月前写过的程序中遇到了完全相同的问题,并将其用作解决方案。当你加载应用程序而不是声明它时,你可能不得不声明pbList,但一旦它被设置,它应该按预期工作。现在在我的手机上,但会尝试挖掘我使用的代码,当我有机会。 – bmgh1985

+0

@JoeyJoeJoeJrShabadoo现在已添加该示例。 – bmgh1985

1

图像无法进行比较,因为图像被复制到内存中,即使像素匹配,图像也会始终不同。直接比较像素以确定图像是否相同。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim pboxes() As PictureBox = {picMainImage, picImage2, picImage3, picImage4} 

    For i As Integer = 0 To pboxes.Count - 1 
     If IsSameImage(pboxes(i).Image, My.Resources.list) = True Then 
      pboxes(i).Image = Nothing 
     End If 
    Next 
End Sub 

Public Function IsSameImage(ByVal oBitmap1 As Bitmap, ByVal oBitmap2 As Bitmap) As Boolean 
    For x = 0 To oBitmap1.Width - 1 
     For y = 0 To oBitmap2.Height - 1 
      If Not oBitmap1.GetPixel(x, y) = oBitmap2.GetPixel(x, y) Then 
       Return False 
      End If 
     Next 
    Next 

    Return True 
End Function