Autore Topic: Cambiare il colore di un pixel se esso è < o > di un valore limite  (Letto 1396 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
« Risposta #1 il: 10 Dicembre 2019, 16:35:36 »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
« Risposta #2 il: 10 Dicembre 2019, 17:08:51 »
Questo esempio è per ottenere il colore di un pixel.
Lo so già fare.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
« Risposta #3 il: 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.  :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
« Risposta #4 il: 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 ?
« Ultima modifica: 12 Dicembre 2019, 01:36:26 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
« Risposta #5 il: 10 Dicembre 2019, 21:43:38 »
A me sembra una buona soluzione.
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
« Risposta #6 il: 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
« Ultima modifica: 12 Dicembre 2019, 21:18:17 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
« Risposta #7 il: 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
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
« Risposta #8 il: 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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Cambiare il colore di un pixel se esso è < o > di un valore limite
« Risposta #9 il: 11 Dicembre 2019, 23:51:50 »
Ora il risultato è identico.
 :ok:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro