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 della PictureBox il valore Null
La prima modalità, molto semplice e rapida, prevede di assegnare alla Proprietà ".Picture" della PictureBox il valore Null, che in sostanza è il valore per annullare o distruggere ogni tipo di "Oggetto".
Esempio pratico:
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