【问题标题】:parameter not valid ERROR - VB.Net - Why am I getting this Error?参数无效错误 - VB.Net - 为什么会出现此错误?
【发布时间】:2016-06-12 01:17:06
【问题描述】:

我收到了这个奇怪的错误 -

“参数无效”

在处理图像时。我正在创建很多很多图像 - 一次最多 50 个。我不清楚这个错误可能是什么。记忆?我在完成计算后处理位图。任何见解都会有所帮助。谢谢。

Private Async Function TakePhoto(ByVal keyword As String) As task

    Await Task.Delay(WaitMs)
    'System.Threading.Thread.Sleep(WaitMs)

    Try
        My.Computer.Audio.Play(Directory.GetCurrentDirectory + "\" + "iphone_camera.wav")
        Dim pic = New Bitmap(WebKitBrowser1.Width, WebKitBrowser1.Height)
        WebKitBrowser1.DrawToBitmap(pic, New Rectangle(0, 0, pic.Width, pic.Height))

        Dim fileName = Directory.GetCurrentDirectory + "\" + "test_ss.bmp"
        Dim CropRect As New Rectangle(240, 190, 1000, 2800)
        Dim OriginalImage1 = Image.FromFile(fileName)
        Dim CropImage1 = New Bitmap(CropRect.Width, CropRect.Height)
        Using grp = Graphics.FromImage(CropImage1)
            grp.DrawImage(OriginalImage1, New Rectangle(0, 0, CropRect.Width, CropRect.Height), CropRect, GraphicsUnit.Pixel)
            OriginalImage1.Dispose()
            CropImage1.Save(fileName)
            CropImage1.Dispose()
        End Using

        fileName = Directory.GetCurrentDirectory + "\" + "test_ss.bmp"
        CropRect = New Rectangle(0, 0, 1000, 1400)
        Dim OriginalImage2 = Image.FromFile(fileName)
        Dim CropImage2 = New Bitmap(CropRect.Width, CropRect.Height)
        Using grp = Graphics.FromImage(CropImage2)
            grp.DrawImage(OriginalImage2, New Rectangle(0, 0, CropRect.Width, CropRect.Height), CropRect, GraphicsUnit.Pixel)
            OriginalImage2.Dispose()
            'CropImage2.Save(Directory.GetCurrentDirectory + "\" + keyword + "_" + "test_ss_top.bmp")
            CropImage2.Save(Directory.GetCurrentDirectory + "\" + "test_ss_top.bmp")
            CropImage2.Dispose()
        End Using

        fileName = Directory.GetCurrentDirectory + "\" + "test_ss.bmp"
        CropRect = New Rectangle(0, 1401, 1000, 1330)
        Dim OriginalImage3 = Image.FromFile(fileName)
        Dim CropImage3 = New Bitmap(CropRect.Width, CropRect.Height)
        Using grp = Graphics.FromImage(CropImage3)
            grp.DrawImage(OriginalImage3, New Rectangle(0, 0, CropRect.Width, CropRect.Height), CropRect, GraphicsUnit.Pixel)
            OriginalImage3.Dispose()
            'CropImage3.Save(Directory.GetCurrentDirectory + "\" + keyword + "_" + "test_ss_bottom.bmp")
            CropImage3.Save(Directory.GetCurrentDirectory + "\" + "test_ss_bottom.bmp")
            CropImage3.Dispose()
        End Using
    Catch ex As Exception
        Dim err = ex.Message
    End Try


End Function

【问题讨论】:

  • 您是否尝试过调试并单步执行代码以缩小引发错误的确切位置?
  • 我可以试试,但问题是程序运行了一段时间——比如 40 张左右的图像——然后突然出现这个错误,所以很难一步一步通过,因为你永远不知道错误什么时候会出现.有什么建议吗?
  • 我之前看到过这个...我不确定我是否理解它为什么会起作用...让我再试一次...
  • 我在下面看到了。我有话要补充。您需要学习调试自己的代码,而不是要求别人为您调试。您有能力比我们更好地调试您的代码,因为您可以使用所有这些代码。如果您不能将其隔离到特定区域,期望我们这样做是不合理的。

标签: vb.net image runtime-error


【解决方案1】:

这一切都源于您处理一次性物品的顺序。当它们仍然可以使用时,您将手动处理它们。尝试在 Using 中包装任何一次性声明,当它超出范围时将按照正确的顺序进行处理。

例如

Dim fileName = Directory.GetCurrentDirectory + "\" + "test_ss.bmp"
Dim CropRect As New Rectangle(240, 190, 1000, 2800)
Using OriginalImage1 = Image.FromFile(fileName)
    Using CropImage1 = New Bitmap(CropRect.Width, CropRect.Height)
        Using grp = Graphics.FromImage(CropImage1)
            grp.DrawImage(OriginalImage1, New Rectangle(0, 0, CropRect.Width, CropRect.Height), CropRect, GraphicsUnit.Pixel)
            CropImage1.Save(fileName)
        End Using
    End Using
End Using

【讨论】:

  • 好的 - 让我试试这个 - 我应该处理图像以确保我没有收到“内存不足错误”吗?你有什么想法?
  • 您处置不再使用的资源以释放它们可能占用的任何内存或它们可能正在使用的其他资源。
  • 这似乎现在可以工作 - 我需要做更多的测试......谢谢
【解决方案2】:
Sub image()
    If connection.State = ConnectionState.Closed Then
        connection.Open()
    End If
    Dim arrImage() As Byte
    Dim strImage As String
    Dim myMs As New IO.MemoryStream
    '
    If Not IsNothing(Form2.picPhoto.Image) Then
        Form2.picPhoto.Image.Save(myMs, Form2.picPhoto.Image.RawFormat)
        arrImage = myMs.GetBuffer
        strImage = "?"
    Else
        arrImage = Nothing
        strImage = "NULL"
    End If


    Dim dt As New DataTable
    Dim da As OleDbDataAdapter = New OleDbDataAdapter(" SELECT * FROM fruits WHERE Name_Of_Fruit = '" & ComboBox1.SelectedValue & "'", connection)

    da.Fill(dt)
    If dt.Rows.Count > 0 Then



        If Not IsDBNull(dt.Rows(0).Item("Picture")) Then
            arrImage = CType(dt.Rows(0).Item("Picture"), Byte())
            For Each ar As Byte In arrImage
                myMs.WriteByte(ar)
            Next
            Form2.picPhoto.Image = System.Drawing.Image.FromStream(myMs)
        End If
    Else
        MessageBox.Show("Record Not Found", "")
    End If
End Sub

结束类强文本

【讨论】:

  • 只有代码的答案不被接受。请尝试使用 control 或 cmd k 再缩进一级(请参阅编辑栏中的 ? 帮助),并请解释修复代码的内容,并突出显示主要关注或最相关改进的领域。
猜你喜欢
  • 1970-01-01
  • 2011-10-08
  • 2022-01-22
  • 2019-01-02
  • 2021-08-04
  • 2021-01-31
  • 2021-01-08
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多