Modificare il colore di un pixel di un'immagine se esso è minore o maggiore di un dato valore

Da Gambas-it.org - Wikipedia.

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