Aggiungere il canale Alfa a un Oggetto Image privo

Da Gambas-it.org - Wikipedia.
Versione del 14 ago 2025 alle 08:06 di Vuott (discussione | contributi)
(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)
Vai alla navigazione Vai alla ricerca

Per aggiungere il canale Alfa a un Oggetto Image, privo di tale canale, è sufficiente convertire l'Oggetto Image in una Picture e successivamente convertire l'Oggetto Picture in una Image.

Mostriamo un esempio che consente di visualizzare un flusso video da una webcam (o altro dispositivo video V4L2) all'interno di una DrawingArea.
Cliccando su Button1 si avvierà la ripresa video; cliccando su Button2 si effettuerà la cattura di un'immagine video, l'attribuzione del canale Alfa e il salvataggio in un file immagine.
E' necessario attivare anche il Componente gb.media.

Private mp As New MediaPlayer


Public Sub Button1_Click()

 With mp
' Se il lettore multimediale sta già riproducendo qualcosa, lo ferma prima di iniziare una nuova riproduzione ed esce dalla routine:
   If .State = Media.Playing Then
     .Stop
     Return 
   Endif
' Imposta la sorgente video: in questo caso è un dispositivo video Linux (Video4Linux2), tipicamente una webcam collegata al sistema, accessibile tramite /dev/video0:
   .URL = "v4l2:///dev/video0"
' Specifica che il video deve essere visualizzato nella "DrawingArea":
   .SetWindow(DrawingArea1)
' Avvia la riproduzione del flusso video:
   .Play()
 End With

End


Public Sub Button2_Click()

 Dim im As Image

 If mp.State <> Media.Playing Then Return

' Viene generato in questo caso un Oggetto "Image" privo di canale Alfa:
 im = mp.Video.Image

' Infatti, se si tenta di conoscere i valori di un pixel oppure se si tenta di modificare l'opacità (quindi il valore del canale Alfa) con il Metodo ".Opacity()" della Classe "Image", si otterrà un errore, perché i singoli pixel hanno adesso una profondità di 24-bit e non di 32-bit:
' Print Hex(im.Pixels[0], 8)
' im = im.Opacity(0.5)

' Converte l'Oggetto "Image" in una "Picture", per aggiungerle automaticamente il canale Alfa, e poi la ri-converte in una "Image":
 im = im.Picture.Image

' Ora, avendo aggiunto il canale Alfa, è possibile conoscere i byte costitutivi del primo pixel dell'Oggetto "Image" e l'opacità dell'immagine:
 Print Hex(im.Pixels[0], 8)
 im = im.Opacity(0.5)

' Salva il risultato in un file immagine PNG:
 im.Save("/tmp/conAlfa.png", 100)

End


Aggiungendo arbitrariamente da codice il canale Alfa

L'esempio, mostrato, prevede l'impostazione dei byte, che costituiranno i singoli pixel dell'Oggetto "Image", senza tener conto del canale Alfa (quindi con profondità a 24-bit), per una dimensione dell'Immagine 8x4 pixel:

Private noAlfa As Image


Public Sub Form_Open()

 Dim st As Stream
 Dim s As String
' Si impostano i singoli byte dei pixel a 24-bit, tenendo conto della posizione che in Gambas dovrà avere il byte del canale Alfa: [nota 1]
 Dim clr As Byte[] = [&00, &00, &FF, &00, &00, &FF, &00, &00, &FF, &00, &00, &FF, &00, &00, &FF, &00, &00, &FF, &00, &00, &FF, &00, &00, &FF, 
                      &00, &FF, &FF, &00, &FF, &FF, &00, &FF, &FF, &00, &FF, &FF, &00, &FF, &FF, &00, &FF, &FF, &00, &FF, &FF, &00, &FF, &FF,
                      &00, &FF, &00, &00, &FF, &00, &00, &FF, &00, &00, &FF, &00, &00, &FF, &00, &00, &FF, &00, &00, &FF, &00, &00, &FF, &00,
                      &FF, &00, &00, &FF, &00, &00, &FF, &00, &00, &FF, &00, &00, &FF, &00, &00, &FF, &00, &00, &FF, &00, &00, &FF, &00, &00]
 
 noAlfa = New Image(8, 4, Color.White, Image.Standard)
 
' Assegna all'Oggetto "Image" i byte del vettore "clr" che costituiranno i suoi pixel, generando così una "Image" priva di canale Alfa:
 st = Memory noAlfa.Data For Write 
 Write #st, clr.Data, clr.Count
 st.Close
 
' Verifica quali byte formano i singoli pixel dell'Oggetto "Image":
 For i As Integer = 0 To clr.Max
   Select Case i
     Case 0 To 23
       s = "\e[31m"
     Case 24 To 47
       s = "\e[33m"
     Case 48 To 71
       s = "\e[32m"
     Case 72 To 95
       s = "\e[34m"
   End Select
   Print i, s; Hex(Byte@(noAlfa.Data + i), 2); "\e[0m"
 Next

' L'Oggetto "Image" è stato creato in modalità "Standard", per cui i cui pixel sono codificati in formato ARGB.
' Pertanto, ora viene creato un file immagine avente canale Alfa impostato automaticamente da Gambas a zero.
noAlfa.Save("/tmp/noAlfa.png", 100)

End


Public Sub Button1_Click()

 Dim conAlfa As Image
 Dim bb As Byte[]
 Dim st As Stream

 bb = New Byte[(noAlfa.W * 3) * noAlfa.H]
 st = Memory noAlfa.Data For Read 
 bb.Read(st, 0, bb.Count)

' Inserisce il canale Alfa impostato al massimo valore possibile (255):
 For i As Integer = 3 To bb.Max + (bb.Count \ 3) Step 4
   bb.Add(&FF, i)
 Next

 conAlfa = New Image(noAlfa.W, noAlfa.H, Color.Transparent, Image.Standard)

' Attribuisce all'area di memoria, deputata a contenere i byte costitutivi dei pixel dell'Oggetto "Image", la nuova serie di byte ora con il canale Alfa impostato al valore 255:
 st = Memory conAlfa.Data For Write 
 bb.Write(st, 0, bb.Count)

 st.Close

' Viene creato un file immagine avente canale Alfa impostato da codice a 255:
 conAlfa.Save("/tmp/conAlfa.png", 100)

End


Note

[1] Sulla gestione delle immagini in Gambas, vedere questa pagina: https://gambaswiki.org/wiki/doc/imageconv?l=it