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