Aggiungere il canale Alfa a un Oggetto Image privo

Da Gambas-it.org - Wikipedia.

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 (è necessario attivare anche il Componente gb.media):

Private mp As New MediaPlayer


Public Sub Button1_Click()

 With mp
   If .State = Media.Playing Then .Stop
   .URL = "v4l2:///dev/video0"
   .SetWindow(DrawingArea1)
   .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:
 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