Rilasciare immagine da PictureBox

di il
3 risposte

Rilasciare immagine da PictureBox

Un saluto a tutto il forum.

Sto' battendo la testa su una cosa magari banale!

Da VB, scannerizzo un documento, che faccio poi vedere in anteprima caricando il file jpg su una PictureBox.

Per evitare errori di caricamento immagine, voglio svuotare tutto il contenuto della cartella, prima di eseguire la scansione.

    Public Sub SvuotaDir(ByVal cartella As String)
        Dim di As IO.DirectoryInfo = New IO.DirectoryInfo(cartella)
        For Each oFile As IO.FileInfo In di.GetFiles()
            oFile.Delete()
        Next
    End Sub

Alla prima scansione, tutto ok, e carico il file jpg nella PictureBox.

Nelle volte successive, nonostante come prima cosa faccia PictureBox.Image = Nothing, mi fallisce l'eliminazione del file, (mi restituisce l'errore che il file .jpg è utilizzato dal processo VB).

Sono ragionevolmente sicuro che la causa è il caricamento dell'immagine nella pictureBox, in quanto se commento quella riga,

(PictureBox.Image = Image.FromFile(FileNameFILE)

ogni scansione funziona correttamente, cioè svuota la cartella ed esegue la scansione e relativa memorizzazione del file jpg.

Come diavolo posso "liberare" il file immagine dalla pictureBox, oltre a (PictureBox.Image = Nothing) ?

Grazie e saluti

DG

3 Risposte

  • Re: Rilasciare immagine da PictureBox

    Il problema e' banale: quando un processo Windows APRE un file, lo BLOCCA, ne senso che non ci puoi fare nulla.
    Questa affermazione NON E' vera al 100%, MA sufficiente per il tuo caso.

    La soluzione e' banale: ti devi ASSICURARE che l'handle, cioe' l'oggetto usato per accedere al  contenuto del file, VENGA CHIUSO.

    Da una ricerca con Google, sembra che ci sia qualche "problema" con VB.

    https://stackoverflow.com/questions/788335/why-does-image-fromfile-keep-a-file-handle-open-sometimes

    Soluzione pratica: usa un diverso meccanismo di lettura del contenuto del file immagine che ti ASSICURA (magari perche' lo fai tu) che il file venga chiuso.

    A "stima" direi che "Image.FromFile()" e' utile SE devi mostrare immagini che rimangono "fisse" durante l'esecuzione dell'applicazione: 
    background, logo, icone varie, ... : una volta "aperte", NESSUNO le tocca.

    Non va bene nel tuo specifico caso.

  • Re: Rilasciare immagine da PictureBox

    Ciao Daniele,

    ti sei inbattuto su uno dei bug conosciuto già da molti anni e mai risolto.
    In pratica il metodo Image.FromFile apre il file per la lettura ma non lo chiude e quindi non rilasciando l'handle non puoi cancellare il file fino a quando non verrà chiusa la tua applicazione.

    Puoi usare questa funzione quando devi caricare immagini su un PictureBox:

        Public Function ImageFromFile(ByVal ImageName As String) As Bitmap
            Dim fp = New IO.FileStream(ImageName, IO.FileMode.Open, IO.FileAccess.Read)
            Dim bmp = New Bitmap(fp)
            fp.Close()
            Return bmp
        End Function

    Ad esempio:

    PictureBox.Image = ImageFromFile(FileNameFILE)
  • Re: Rilasciare immagine da PictureBox

    Ciao a tutti e grazie come sempre.

    Con la routine di SirJo funziona egregiamente !

    Un saluto a tutti.

    DG

Devi accedere o registrarti per scrivere nel forum
3 risposte