Как сохранить изображение из Picturebox, которое загружается с камеры? - PullRequest
1 голос
/ 18 января 2020

Я создаю простую программу, которая получает изображение с камеры и отображает его в картинке с помощью библиотеки Aforge. Тем не менее, когда я пытаюсь сохранить изображение из графического окна. Она выдает ошибку типа «System.Runtime.InteropServices.ExternalException» в System.Drawing.dll. В GDI + произошла ошибка generic c.

Я провел некоторое исследование, но не нашел никакого полезного решения .

Ниже приведен следующий код, используемый для сохранения изображения:

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        PictureBox1.Image.Save("C:\a.jpeg", ImageFormat.Jpeg)

End Sub

Обновленный код:

Imports AForge
Imports AForge.Video
Imports AForge.Video.DirectShow
Imports AForge.Imaging.Filters
Imports AForge.Imaging
Imports System.Drawing.Imaging

Public Class Form1

    Dim Filter As FilterInfoCollection
    Dim Camera As VideoCaptureDevice


    Dim MINR As Integer = 0
    Dim MING As Integer = 0
    Dim MINB As Integer = 0
    Dim MAXR As Integer = 255
    Dim MAXG As Integer = 255
    Dim MAXB As Integer = 255

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        Filter = New FilterInfoCollection(FilterCategory.VideoInputDevice)
        If Filter.Count > 0 Then
            For Each ITEM In Filter
                ComboBox1.Items.Add(ITEM.Name.ToString())
            Next

            CheckForIllegalCrossThreadCalls = False

            Me.Location = New System.Drawing.Point(Me.Location.X, 0)
        Else
            MsgBox("NO Camera Found")
        End If
    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged

        Camera = New VideoCaptureDevice(Filter(ComboBox1.SelectedIndex).MonikerString)
        AddHandler Camera.NewFrame, New NewFrameEventHandler(AddressOf Video_NewFrame)
        Camera.Start()
        ComboBox1.Visible = False
    End Sub

    Private Sub Video_NewFrame(sender As Object, eventArgs As AForge.Video.NewFrameEventArgs)

        Dim ORIGINAL As Bitmap = DirectCast(eventArgs.Frame.Clone(), Bitmap)
        Dim FILTER As Bitmap = DirectCast(eventArgs.Frame.Clone(), Bitmap)


        Dim CFILTER As New ColorFiltering
        CFILTER.Red = New IntRange(MINR, MAXR)
        CFILTER.Green = New IntRange(MING, MAXG)
        CFILTER.Blue = New IntRange(MINB, MAXB)
        CFILTER.ApplyInPlace(FILTER)


        Dim GRAY As Grayscale = Grayscale.CommonAlgorithms.BT709
        Dim IMAGING As Bitmap = GRAY.Apply(FILTER)


        Dim BLOBS As New BlobCounter()
        BLOBS.MinHeight = 10
        BLOBS.MinWidth = 10
        BLOBS.ObjectsOrder = ObjectsOrder.Size
        BLOBS.ProcessImage(IMAGING)

        Dim Rectangle As Rectangle() = BLOBS.GetObjectsRectangles()
        If Rectangle.Count > 0 Then
            Dim Rectangle2 As Rectangle = Rectangle(0)
            Dim STYLE As Graphics = Graphics.FromImage(ORIGINAL)
            Dim CLR As New Pen(Color.Lime, 5)
            STYLE.DrawRectangle(CLR, Rectangle2)
            STYLE.Dispose()
        End If

        PictureBoxDefault.Image = ORIGINAL '
        PictureBoxFilter.Image = FILTER
    End Sub


    Private Sub TrackBarMINR_Scroll(sender As System.Object, e As System.EventArgs) Handles TrackBarMINR.Scroll
        MINR = TrackBarMINR.Value
        LabelMINR.Text = "MINR: " & MINR
    End Sub

    Private Sub TrackBarMING_Scroll(sender As System.Object, e As System.EventArgs) Handles TrackBarMING.Scroll
        MING = TrackBarMING.Value
        LabelMING.Text = "MING: " & MING
    End Sub

    Private Sub TrackBarMINB_Scroll(sender As System.Object, e As System.EventArgs) Handles TrackBarMINB.Scroll
        MINB = TrackBarMINB.Value
        LabelMINB.Text = "MINB: " & MINB
    End Sub

    Private Sub TrackBarMAXR_Scroll(sender As System.Object, e As System.EventArgs) Handles TrackBarMAXR.Scroll
        MAXR = TrackBarMAXR.Value
        LabelMAXR.Text = "MAXR: " & MAXR
    End Sub

    Private Sub TrackBarMAXG_Scroll(sender As System.Object, e As System.EventArgs) Handles TrackBarMAXG.Scroll
        MAXG = TrackBarMAXG.Value
        LabelMAXG.Text = "MAXG: " & MAXG
    End Sub

    Private Sub TrackBarMAXB_Scroll(sender As System.Object, e As System.EventArgs) Handles TrackBarMAXB.Scroll
        MAXB = TrackBarMAXB.Value
        LabelMAXB.Text = "MAXB: " & MAXB
    End Sub

    Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Try
            Camera.SignalToStop()
        Catch ex As Exception
        End Try
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles btnSave.Click

        PictureBox1.Image.Save("D:\a.png", ImageFormat.Png)

    End Sub


End Class

1 Ответ

0 голосов
/ 31 января 2020

У меня была такая же проблема. Код ниже теперь работает для меня.

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim img As Bitmap = PictureBox1.Image.Clone
    img.Save("Z:\test.bmp", System.Drawing.Imaging.ImageFormat.Bmp)
End Sub

Просто замените «Z: \ test.bmp» на свой каталог, не пробовал другие форматы изображений, но это единственный способ, которым я его получил работать до сих пор.

...