Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    VB.NET e GDI+ non riesco a liberare i file di immagine

    Ho creato un form con un controllo picture ed ho messo queste due dichiarazioni all'inizio in modo tale che la visibilità delle variabili dichiarate sia a livello di tutto il codice del form.

    codice:
        
        Private Immagine As String=""
        Private Imgnotf As String="c:\temp\nontrovata.jpg"
    Poi ho creato le seguenti routine:
    codice:
        Private Sub CaricaImmagine()
            immagine = "c:\temp\prova.jpg"
            If Not (ImgBig.Image Is Nothing) Then
                ImgBig.Image.Dispose()
                ImgBig.Image = Nothing
            End If
            Try
                If IO.File.Exists(immagine) Then
                    ImgBig.Image = New Bitmap(immagine)
                Else
                    ImgBig.Image = New Bitmap(imgnotf)
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub
    
        Private Sub CreaImmagine()
            OFD.Filter = "File di immagine supportati (*.Bmp,*.Emf,*.Exif,*.Gif,*.Icon,*.Jpeg,*.Jpg,*.Png,*.Tiff,*.Tif,*.Wmf)|*.Bmp;*.Emf;*.Exif;*.Gif;*.Icon;*.Jpeg;*.Jpg;*.Png;*.Tiff;*.Tif;*.Wmf"
            OFD.Multiselect = False
            OFD.ShowDialog()
            If IO.File.Exists(OFD.FileName) Then
                Dim ImgOld As New Bitmap(OFD.FileName)
                Dim ImgNew As New Bitmap(ImgOld, 400, 290) 'questa mi serve per ridimensionare l'immagine a mio piacimento
                ImgNew.Save(immagine)
                ImgNew.Dispose()
                ImgOld.Dispose()
                ImgBig.Image.Dispose()
                ImgBig.Image = New Bitmap(immagine)
            End If
        End Sub
    
        Private Sub CancellaImmagine()
            Do
                ImgBig.Image.Dispose()
                ImgBig.Image = Nothing
                ImgBig.Image = New Bitmap(imgnotf)
                Me.Refresh()
                ImgBig.Refresh()
                Try
                    IO.File.Delete(immagine)
                    Exit Do
                Catch ex As Exception
                    Dim x As Microsoft.VisualBasic.MsgBoxResult = MsgBox("Impossibile eliminare il file!" & vbCrLf & "Riprovare?", MsgBoxStyle.YesNo, Appl.Titolo)
                    If x = MsgBoxResult.No Then Exit Do
                End Try
            Loop
        End Sub
    Il progetto avvia un'altro form che con un pulsante mi richiama questo.
    Sull'evento Load del Form faccio una chiamata alla routine caricaimmagine
    ho aggiunto un bottone "carca..." e un controllo openfiledialog chiamato OFD
    a questo punto ho messo sull'evento click del pulsante una chiamata alla routine creaimmagine
    poi ho creato un pulsante "cancella..." e sul suo evento click la chiamata alla routine cancellaimmagine
    ho testato l'applicazione e funziona ma ad un certo punto ho scoperto questo errore che si verifica solo effettuando le seguenti operazioni:

    1-apro il form
    2-carico un'immagine
    3-chiudo il form
    4-riapro il form
    5-cancello l'immagine

    il debug mi da che non può cancellare il file perchè in uso da un'altro processo.
    se però ad esempio faccio così:

    1-apro il form
    2-carico un'immagine
    5-cancello l'immagine

    funziona oppure faccio:

    1-apro il form
    2-carico un'immagine
    3-chiudo il form
    4-chiudo l'applicazione
    6-rilancio l'applicazione e apro il form
    7-cancello l'immagine

    allora anche in questo caso funziona.
    da cosa potrebbe dipendere?
    *** Rachele TI AMO DA MORIRE!!! ***

  2. #2
    Up
    *** Rachele TI AMO DA MORIRE!!! ***

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    261
    Non devi caricare l'immagine con il comando .image perchè tiene impegnata l'immagine sull'hard disk, devi utilizzare un FileStream e dopo associarlo alla tua picturebox

    codice:
    Dim fs As System.IO.FileStream
    fs = New System.IO.FileStream(Percorsoimmagine, FileMode.Open, IO.FileAccess.Read)
    PicImmagine.Image = Image.FromStream(fs)
    fs.Close()
    adesso l'immagine sull'hard disk non sarà più impegnata e potrai fare quello che vuoi.

  4. #4
    ci provo e ti faccio sapere se funziona

    grazie
    *** Rachele TI AMO DA MORIRE!!! ***

  5. #5
    graze no 1000 ma 2000!!!!

    funziona ora!!!
    *** Rachele TI AMO DA MORIRE!!! ***

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.