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 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