Cancellare una immagine in una PictureBox o in una ImageView
Per cancellare un'immagine caricata precedentemente in una PictureBox o in una ImageView, si potranno adottare almeno due modalità.
Gli esempi di seguito mostrati faranno uso di una PictureBox, ma sono validi anche volendo utilizzare una ImageView.
Assegnare alla Proprietà ".Picture" o alla Proprietà ".Image" della PictureBox il valore Null
La prima modalità, molto semplice e rapida, prevede di assegnare alla Proprietà ".Picture" o alla Proprietà ".Image" della PictureBox il valore Null, che in sostanza è il valore per annullare o distruggere ogni tipo di Oggetto.
Esempio pratico con la Proprietà ".Picture":
Public Sub Form_Open() PictureBox1.Picture = Picture.Load("/percorso/del/file/immagine") End Public Sub Button1_Click() ' Cancelliamo l'immagine precedentemente caricata: PictureBox1.Picture = Null End
Questa modalità è valida anche per cancellare un'immagine precedentemente caricata in una variabile di tipo Picture:
Private pc As Picture Public Sub Form_Open() pc = Picture.Load("/percorso/del/file/immagine") PictureBox1.Picture = pc End Public Sub Button1_Click() ' Distruggiamo l'Oggetto "Picture", assegnando alla sua variabile il valore "Null": pc = Null ' Verifichiamo l'effetto dell'assegnazione di "Null" all'Oggetto "Picture": PictureBox1.Picture = pc End
Differenza fra ".Picture.Clear" e l'assegnazione del valore "Null"
Il Metodo ".Picture.Clear()" cancella solo il contenuto dell'immagine restituita dalla Proprietà, che è in qualche modo una copia dell'immagine interna di immagine interna della PictureBox, che rimane invariata.
Azzerando i valori afferenti ai pixel dell'immagine mediante i Memory Stream
La seconda modalità prevede di accedere all'area di memoria della Struttura "GB_IMG ", dichiarata nei sorgenti di Gambas per la gestione dell'Oggetto Image.
Successivamente all'accesso all'area di memoria della Struttura "GB_IMG ", si dovrà in particolare accedere all'area di memoria puntata dal Puntatore presente come secondo membro, denominato "unsigned char *data ", nella predetta Struttura "GB_IMG ", e si provvederà mediante i Memory Stream ad azzerare tutti i valori afferenti ai pixel dell'immagine caricata. Per la determinazione della quantità di byte da azzerare, si avrà cura di moltiplicare le Proprietà ".Width", ".Height" e "(.Depth / 8)" dell'Oggetto Image.
Azzerati tutti i valori dei pixel, si provvederà a ricaricare nella PictureBox l'immagine, la quale, avendo ora il valore del canale "Alfa" impostato a zero, risulterà del tutto trasparente, lasciando così intravedere il colore di sfondo dell'oggetto PictureBox.
Mostriamo un esempio pratico:
Private im As Image Public Sub Form_Open() im = Image.Load("/percorso/del/file/immagine") With PictureBox1 .X = 10 .Y = 10 .W = im.W .H = im.H .Image = im End With End Public Sub Button1_Click() Dim p1, p2 As Pointer Dim i As Integer Dim st As Stream ' Accediamo all'area di memoria riservata della Struttura "GB_IMG" costituente l'Oggetto "Image" corrente: p1 = Object.Address(im) ' Accediamo all'area di memoria riservata puntata dal 2° membro della Struttura "GB_IMG": p2 = Pointer@(p1 + (SizeOf(gb.Pointer) * 2)) ' Utilizziamo i "Memory Stream" in scrittura per azzerare tutti i dati afferenti ai pixel dell'immagine: st = Memory p2 For Write For i = 0 To im.W * im.H * (im.Depth / 8) Write #st, 0 As Byte Next st.Close ' Ricarichiamo l'immagine ormai con i valori dei suoi pixel tutti azzerati: PictureBox1.Image = im End
Oppure evitando l'uso di una variabile di tipo Image e usando invece direttamente la Proprietà ".Image" della PictureBox:
Public Sub Form_Open() With PictureBox1 .X = 10 .Y = 10 .Image = Image.Load("/percorso/del/file/immagine") .W = .Image.W .H = .Image.H End With End Public Sub Button1_Click() Dim p1, p2 As Pointer Dim i As Integer Dim st As Stream p1 = Object.Address(PictureBox1.Image) p2 = Pointer@(p1 + (SizeOf(gb.Pointer) * 2)) st = Memory p2 For Write For i = 0 To PictureBox1.Image.W * PictureBox1.Image.H * (PictureBox1.Image.Depth / 8) Write #st, 0 As Byte Next st.Close ' Rinnoviamo l'esposizione dell'immagine ormai con i valori dei suoi pixel tutti azzerati: PictureBox1.Refresh End