Esta función llena mi RAM. ¿Cómo disponer fotos, pero para que el regreso siga funcionando?

Uso una función que escala una imagen y la devuelve. En esta función no puedo usar Using, porque de lo contrario la imagen es Nothing. Ahora es el caso de que esta función de escalado se llama más a menudo (14 veces) y llena mi RAM con basura. Incluso después de que el formulario2 (donde está ese código) haya cerrado. ¿Cómo puedo deshacerme del bitmap que se crea en la función cada vez?

La función escala la imagen original cuando se hizo clic en una casilla de verificación, de lo contrario devuelve la imagen original en su tamaño original.

En el evento de cierre de formularios, se asegura que todos los PictureBoxes están vaciados. Todas las listas (de T) están vacías. Sospecho que debe ser debido a la función de escalado.

en Button1_Click

Using skaliertes_Bitmap As New Bitmap(Bild_sk(Bildpfade1(i)))

la función

Private Function Bild_sk(ByVal path As String) As Bitmap
    Dim Original_Bitmap As New Bitmap(path)
    If CheckBox1.Checked AndAlso (Original_Bitmap.Size.Width <> gew_Breite OrElse Original_Bitmap.Size.Height <> gew_Hoehe) Then
        Dim bitmap1 As New Bitmap(gew_Breite, gew_Hoehe, Imaging.PixelFormat.Format24bppRgb)
        Using Gr As Graphics = Graphics.FromImage(bitmap1)
            Gr.DrawImage(Original_Bitmap, 0, 0, gew_Breite, gew_Hoehe)
        End Using
        Return bitmap1
    Else
        Return Original_Bitmap
    End If
End Function
Private Sub Form_auswaehlen_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    For Each pb In Me.Controls.OfType(Of PictureBox)()
        If pb.Image IsNot Nothing Then
            pb.Image.Dispose()
        End If
    Next       
End Sub

Pregunta hecha hace 3 años, 4 meses, 29 días - Por codealchemyf00f


3 Respuestas:

  • Acabo de descubrir que no escribí una respuesta. Dios mío. Fuera de mi cabeza: Por supuesto que puedes usar Using, pero tienes que escribir Return New Bitmap(Original_Bitmap) o Return New Bitmap(bitmap1).

    Respondida el Dec 16, 2020 a las 19:57 - por compilercaptain7dab

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando con el exceso de uso de memoria puede estar relacionado con la creación de instancias de objetos Bitmap en tu función Bild_sk. Según lo que mencionas, la imagen no se está liberando correctamente de la memoria después de ser utilizada, lo que puede causar una acumulación de objetos Bitmap consumiendo RAM.

    Para solucionar este problema, puedes intentar liberar la memoria de las instancias de Bitmap que creas en tu función Bild_sk antes de salir de la función. Puedes hacerlo utilizando el método Dispose() en las instancias de Bitmap que ya no necesites. Aquí te dejo una sugerencia de cómo podrías modificar tu función Bild_sk:

    vb
    Private Function Bild_sk(ByVal path As String) As Bitmap
        Dim Original_Bitmap As New Bitmap(path)
        Dim scaledBitmap As Bitmap = Nothing
    
        If CheckBox1.Checked AndAlso (Original_Bitmap.Size.Width <> gew_Breite OrElse Original_Bitmap.Size.Height <> gew_Hoehe) Then
            scaledBitmap = New Bitmap(gew_Breite, gew_Hoehe, Imaging.PixelFormat.Format24bppRgb)
            Using Gr As Graphics = Graphics.FromImage(scaledBitmap)
                Gr.DrawImage(Original_Bitmap, 0, 0, gew_Breite, gew_Hoehe)
            End Using
    
            ' Dispose la instancia de Original_Bitmap si ya no la necesitas
            Original_Bitmap.Dispose()
        Else
            scaledBitmap = Original_Bitmap
        End If
    
        Return scaledBitmap
    End Function
    

    En este ejemplo, antes de devolver el bitmap escalado, se libera la memoria de la instancia de Original_Bitmap si se creó una nueva imagen escalada. De esta forma, estarás asegurándote de que la memoria se libere correctamente para evitar un consumo excesivo de RAM.

    Espero que esta solución te sea de ayuda. ¡Avísame si tienes alguna otra pregunta!

    Respondida el Dec 17, 2020 a las 19:59 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema es que la imagen escalada bitmap1 nunca se desecha. Esto se debe a que la función Bild_sk devuelve la imagen escalada en lugar de devolverla como un objeto Using.

    Para solucionar este problema, puedes devolver la imagen escalada como un objeto Using de la siguiente manera:

    vb
    Private Function Bild_sk(ByVal path As String) As Bitmap
        Using Original_Bitmap As New Bitmap(path)
            If CheckBox1.Checked AndAlso (Original_Bitmap.Size.Width <> gew_Breite OrElse Original_Bitmap.Size.Height <> gew_Hoehe) Then
                Using bitmap1 As New Bitmap(gew_Breite, gew_Hoehe, Imaging.PixelFormat.Format24bppRgb)
                    Using Gr As Graphics = Graphics.FromImage(bitmap1)
                        Gr.DrawImage(Original_Bitmap, 0, 0, gew_Breite, gew_Hoehe)
                        Return bitmap1 ' Devolver la imagen escalada como un objeto Using
                    End Using
                End Using
            Else
                Return Original_Bitmap ' Devolver la imagen original si no se necesita escalar
            End If
        End Using
    End Function
    

    Esto asegurará que la imagen escalada se elimine correctamente cuando ya no se necesite.

    Además, puedes agregar un controlador de eventos Disposed al PictureBox para asegurarte de que la imagen se elimine cuando el PictureBox se elimine.

    vb
    Private Sub PictureBox1_Disposed(sender As Object, e As EventArgs) Handles PictureBox1.Disposed
        If PictureBox1.Image IsNot Nothing Then
            PictureBox1.Image.Dispose()
        End If
    End Sub
    

    Respondida el Dec 17, 2020 a las 20:10 - por Gemini

    Votos positivos: 0 | Votos negativos: 0