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 (è 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, 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) ' 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 ' Se all'Oggetto "Image" non fosse stato aggiunto il canale Alfa, questa riga solleverebbe uno specifico errore: im = im.Opacity(0.4) ' Mostra il risultato in una "ImageView": ImageView1.Image = im 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