Modificare il colore di un pixel di un'immagine se esso è minore o maggiore di un dato valore
Da Gambas-it.org - Wikipedia.
Versione del 16 ago 2020 alle 12:22 di Vuott (Discussione | contributi)
Il caso è quello in cui avendo un file immagine RGBA (quindi in formato a 32 bit), viene verificato il valore del colore di ciascun suo pixel: se il valore RGBA riscontrato di un pixel è - ad esempio - maggiore di un determinato valore (prescelto dall'utente), viene cambiato il colore di quel pixel ad esempio in bianco (&hFFFFFFFF).
Esempio:
Public Sub Form_Open() Dim im As Image Dim st As Stream Dim i As Integer Dim l, limite As Long ' Viene stabilito il valore del colore, al di sopra del quale al pixel sarà assegnato il valore del colore bianco limite = &FFC0C0C0& im = Image.Load("/percorso/del/file/immagine/RGBA") st = Memory im.data For Write For i = 0 To im.Pixels.Max * 4 Step 4 l = CLong(Byte@(im.Data + i)) l += CLong(Shl(CInt(Byte@(im.Data + (i + 1))), 8)) l += CLong(Shl(CInt(Byte@(im.Data + (i + 2))), 16)) l += CLong(Shl(CLong(Byte@(im.Data + (i + 3))), 24)) If l > limite Then Write #st, Color.RGB(255, 255, 255, 255) As Integer ' Impone il pixel bianco Else Seek #st, Seek(st) + 4 Endif Next st.Close With Me .W = im.W .H = im.H End With With PictureBox1 .W = im.W .H = im.H .Image = im End With End
Per una soluzione che offra maggiore velocità, è opportuno affidare il ciclo e la conversione ad una libreria esterna scritta da noi in linguaggio C:
' void kyklos (unsigned int * img, int wh, long int lmt) ' Esegue il ciclo per la verifica dei pixel. Private Extern kyklos(img As Pointer, wh As Integer, lmt As Long) In "/tmp/kyklos" Public Sub Form_Open() Dim im As Image Dim limite As Long ' Invoca la procedura per la creazione della libreria esterna .so in C: Creaso() ' Viene stabilito il valore del colore, al di sopra del quale al pixel sarà assegnato il valore del colore bianco limite = &FFC0C0C0& im = Image.Load("/percorso/del/file/immagine/RGBA") kyklos(im.Data, im.W * im.H, limite) With Me .W = im.W .H = im.H End With With PictureBox1 .W = im.W .H = im.H .Image = im End With End Private Procedure Creaso() File.Save("/tmp/kyklos.c", "void kyklos(unsigned int * img, int wh, long int lmt)" & "\n{\n" & " int c;\n" & " unsigned int ff = 0xFFFFFFFF;\n\n" & /* Imposta il colore bianco */ " for (c=0; c<wh; c++) \n" & " if (*(img+c) > lmt){\n" & " *(img+c) = ff;}\n" & "}") ' Genera la libreria esterna condivisa .so: Shell "gcc -o /tmp/kyklos.so /tmp/kyklos.c -shared" Wait End