Differenze tra le versioni di "Modificare il colore di un pixel di un'immagine se esso è minore o maggiore di un dato valore"

Da Gambas-it.org - Wikipedia.
Riga 2: Riga 2:
  
 
Esempio:
 
Esempio:
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
    
 
    
 
   Dim im As Image
 
   Dim im As Image
Riga 12: Riga 12:
 
   limite = &FFC0C0C0&
 
   limite = &FFC0C0C0&
 
    
 
    
   im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine/RGBA''</font>")
+
   im = Image.Load("<FONT Color=darkgreen>''/percorso/del/file/immagine/RGBA''</font>")
 
    
 
    
 
   st = Memory im.data For Write
 
   st = Memory im.data For Write
Riga 40: Riga 40:
 
   End With
 
   End With
 
    
 
    
  '''End'''
+
  End
  
  
 +
===Usndo una libreria esterna scritta da noi===
 
Per una soluzione che offra maggiore velocità, è opportuno affidare il ciclo e la conversione ad una libreria esterna scritta da noi in linguaggio C:
 
Per una soluzione che offra maggiore velocità, è opportuno affidare il ciclo e la conversione ad una libreria esterna scritta da noi in linguaggio C:
 
  <FONT Color=gray>' ''void kyklos (unsigned int * img,  int wh, long int lmt)''
 
  <FONT Color=gray>' ''void kyklos (unsigned int * img,  int wh, long int lmt)''
Riga 49: Riga 50:
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
    
 
    
 
   Dim im As Image
 
   Dim im As Image
Riga 60: Riga 61:
 
   limite = &FFC0C0C0&
 
   limite = &FFC0C0C0&
 
    
 
    
   im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine/RGBA''</font>")
+
   im = Image.Load("<FONT Color=darkgreen>''/percorso/del/file/immagine/RGBA''</font>")
 
    
 
    
 
   kyklos(im.Data, im.W * im.H, limite)
 
   kyklos(im.Data, im.W * im.H, limite)
Riga 74: Riga 75:
 
   End With
 
   End With
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Procedure Creaso()
+
  Private Procedure Creaso()
 
    
 
    
 
   File.Save("/tmp/kyklos.c", "void kyklos(unsigned int * img, int wh, long int lmt)" &
 
   File.Save("/tmp/kyklos.c", "void kyklos(unsigned int * img, int wh, long int lmt)" &
Riga 91: Riga 92:
 
   Shell "gcc -o /tmp/kyklos.so /tmp/kyklos.c -shared" Wait
 
   Shell "gcc -o /tmp/kyklos.so /tmp/kyklos.c -shared" Wait
 
    
 
    
  '''End'''
+
  End

Versione delle 15:15, 3 lug 2024

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


Usndo una libreria esterna scritta da noi

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