Gambas-it

Gambas3 => Domande tecniche => Topic aperto da: vuott - 10 Dicembre 2019, 16:28:53

Titolo: Cambiare il colore di un pixel se esso è < o > di un valore limite
Inserito da: vuott - 10 Dicembre 2019, 16:28:53
Sapete se esiste una funzione Gambas che faccia quanto appresso ?

Avendo un file immagine RGBA (quindi in formato a 32 bit), verifico il valore del colore di ciascun suo pixel: se il valore RGBA riscontrato di un pixel è maggiore di un determinato valore (da me prescelto), cambio il colore di quel pixel in bianco: &hFFFFFFFF
Titolo: Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
Inserito da: Gianluigi - 10 Dicembre 2019, 16:35:36
Non sono certo, ma questo potrebbe aiutarti?

https://www.gambas-it.org/smf/index.php?topic=6188.msg43395#msg43395
Titolo: Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
Inserito da: vuott - 10 Dicembre 2019, 17:08:51
Questo esempio è per ottenere il colore di un pixel.
Lo so già fare.
Titolo: Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
Inserito da: vuott - 10 Dicembre 2019, 17:13:03
...sì, sì, lo so che c'è questa pagina della WIKI:
   https://www.gambas-it.org/wiki/index.php?title=Modificare_i_colori_dei_pixel_di_un%27immagine_con_la_propriet%C3%A0_.Data_della_Classe_Image_ed_i_Memory_Stream

Mi pare che una funzione propria di Gambas non vi sia ancora, per cambiare velocemente in un determinato colore molti pixel.  :-\
Titolo: Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
Inserito da: vuott - 10 Dicembre 2019, 20:54:09
Ho fatto questo:

Codice: [Seleziona]
Public Sub Form_Open()

  Dim im As Image
  Dim st As Stream
  Dim i As Integer
  Dim l, limite As Long

  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

Avete un'idea migliore ?
Titolo: Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
Inserito da: Top Fuel - 10 Dicembre 2019, 21:43:38
A me sembra una buona soluzione.
Titolo: Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
Inserito da: vuott - 10 Dicembre 2019, 23:10:04
Per vedere quanto è più veloce il programma, affidando il ciclo e la conversione ad una libreria esterna scritta in linguaggio C...

Codice: [Seleziona]
' 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
 
  Creaso()   ' Invoca la procedura per la creazione della libreria esterna .so in C
 
  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" &
            "   for (c=0; c<wh; c++) \n" &
            "      if (*(img+c) > lmt){\n" &
            "         *(img+c) = ff;}\n" &
            "}")
           
  Shell "gcc -o /tmp/kyklos.so /tmp/kyklos.c -shared" Wait
 
End
Titolo: Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
Inserito da: Gianluigi - 10 Dicembre 2019, 23:48:26
Rientro adesso, domani cerco di capire qualcosa del codice che hai postato.
Il codice C è senz'altro più veloce, ma noto che i due programmi non sono uguali, vedi immagini allegate
Titolo: Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
Inserito da: vuott - 11 Dicembre 2019, 22:45:01
... noto che i due programmi non sono uguali, vedi immagini allegate
Hai ragione.
Ora ho cambiato algoritmo.
Riprova il primo codice e fammi sapere.
Grazie
Titolo: Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
Inserito da: Gianluigi - 11 Dicembre 2019, 23:51:50
Ora il risultato è identico.
 :ok: