Aggiungere il canale Alfa a un Oggetto Image privo
Da Gambas-it.org - Wikipedia.
Versione del 1 nov 2024 alle 05:13 di Vuott (Discussione | contributi)
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 ' 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.3) ' Mostra il risultato in una "ImageView": ImageView1.Image = im End
Aggiungendo arbitrariamente da codice il canale Alfa
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/immagine.png", 100) End