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 il Metodo ".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