Cancellare una immagine in una PictureBox o in una ImageView

Da Gambas-it.org - Wikipedia.

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