Aggiungere il canale Alfa a un Oggetto Image privo
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.
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