Differenze tra le versioni di "Individuare il colore di un determinato pixel"

Da Gambas-it.org - Wikipedia.
 
(6 versioni intermedie di uno stesso utente non sono mostrate)
Riga 3: Riga 3:
  
 
==Uso delle sole risorse di Gambas==
 
==Uso delle sole risorse di Gambas==
Volendo utilizzare le sole riorse di Gambas, si potrà utilizzare semplicemente il seguente codice:
+
Volendo utilizzare le sole risorse di Gambas, si potranno adottare un paio di modalità.
 +
 
 +
===Individuare le coordinate del pixel mediante la Classe "Image"===
 +
Si potrà individuare il pixel dell'immagine impostando le sue coordinate x,y con la Classe "Image".
 
  '''Public''' Sub Button1_Click()
 
  '''Public''' Sub Button1_Click()
 
   
 
   
Riga 9: Riga 12:
 
   Dim nCol As Integer  
 
   Dim nCol As Integer  
 
   
 
   
  im = Image.Load("<FONT color=gray>''/percorso/del/file/immagine''</font>")
+
  im = Image.Load("<FONT color=gray>''/percorso/del/file/immagine''</font>")
 
   
 
   
 
  <FONT color=gray>' ''Individueremo il pixel dell'immagine mediante le sue coordinate x ed y (che ovviamente dovranno essere specificate):''</font>
 
  <FONT color=gray>' ''Individueremo il pixel dell'immagine mediante le sue coordinate x ed y (che ovviamente dovranno essere specificate):''</font>
    nCol = im<FONT color=#B22222>[''x'', ''y'']</font>
+
  nCol = im<FONT color=#B22222>[''x'', ''y'']</font>
 
   
 
   
    Print "Il numero decimale del colore del pixel è: "; nCol, "&h"; Hex(nCol, 8)
+
  Print "Il numero decimale del colore del pixel è: "; nCol, "&h"; Hex(nCol, 8)
 
   
 
   
 
  '''End'''
 
  '''End'''
 
Verrà restituito il numero decimale del colore del pixel, determinato dalle coordinate ''x'' ed ''y'' all'interno dell'immagine.
 
Verrà restituito il numero decimale del colore del pixel, determinato dalle coordinate ''x'' ed ''y'' all'interno dell'immagine.
 
  
 
===Individuare il colore di un pixel di un'immagine cliccandoci sopra con il mouse===
 
===Individuare il colore di un pixel di un'immagine cliccandoci sopra con il mouse===
 
Mostriamo un esempio nel quale, cliccando su un'immagine inserita in una ''PictureBox'', viene mostrato in una ''TextLabel'' il colore del pixel, nonché in console il corrispondente numero:
 
Mostriamo un esempio nel quale, cliccando su un'immagine inserita in una ''PictureBox'', viene mostrato in una ''TextLabel'' il colore del pixel, nonché in console il corrispondente numero:
 
  Private im As Image
 
  Private im As Image
 +
Private PictureBox1 As PictureBox
 +
Private label1 As Label
 
    
 
    
 
   
 
   
Riga 30: Riga 34:
 
   im = Image.Load("<FONT color=gray>''/percorso/del/file/immagine''</font>")
 
   im = Image.Load("<FONT color=gray>''/percorso/del/file/immagine''</font>")
 
    
 
    
  <FONT color=gray>' ''Rendiamo la "PictureBox" delle medesime dimensioni dell'immagine caricata:''</font>
+
  With Me
 +
    .W = im.W
 +
    .H = im.H + 50
 +
    .Center
 +
  End With
 +
  <FONT color=gray>' ''Rendiamo la "PictureBox" delle medesime dimensioni del "Form" principale:''</font>
 
   With PictureBox1
 
   With PictureBox1
 +
    .X = 0
 +
    .Y = 0
 
     .W = im.W
 
     .W = im.W
 
     .H = im.H
 
     .H = im.H
<FONT color=gray>' ''Quindi carichiamo l'immagine, contenuta nella variabile di tipo "Image", nella "PictureBox":''</font>
 
 
     .Image = im
 
     .Image = im
 +
  End With
 +
  With label1 = New Label(Me)
 +
    .X = 0
 +
    .Y = PictureBox1.H + 10
 +
    .W = Me.W
 +
    .H = 35
 
   End With
 
   End With
 
   
 
   
 
  '''End'''
 
  '''End'''
 
 
   
 
   
 
  '''Public''' Sub PictureBox1_MouseDown()
 
  '''Public''' Sub PictureBox1_MouseDown()
Riga 46: Riga 61:
 
   
 
   
 
  <FONT color=gray>' ''Individuiamo le coordinate x ed y del puntatore del mouse, quando clicchiamo nella "PictureBox" sull'immagine:''</font>
 
  <FONT color=gray>' ''Individuiamo le coordinate x ed y del puntatore del mouse, quando clicchiamo nella "PictureBox" sull'immagine:''</font>
   With Mouse
+
   nCol = im[Mouse.X, Mouse.Y]
    nCol = im[.X, .Y]
+
    
   End With
 
 
 
  <FONT color=gray>' ''Quindi otteniamo il numero del colore del pixel cliccato con il mouse...''</font>
 
  <FONT color=gray>' ''Quindi otteniamo il numero del colore del pixel cliccato con il mouse...''</font>
 
   Print "Il numero del colore del pixel cliccato è: "; nCol, "&h"; Hex(nCol, 8)
 
   Print "Il numero del colore del pixel cliccato è: "; nCol, "&h"; Hex(nCol, 8)
 
   
 
   
  <FONT color=gray>' ''...nonché mostriamo il suo colore nella "TextLabel" posta sul Form:''</font>
+
  <FONT color=gray>' ''...e mostriamo il suo colore nella "Label" posta sul Form:''</font>
   TextLabel1.Background = nCol
+
   Label1.Background = nCol
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 62: Riga 75:
 
Si potranno anche utilizzare le risorse del API di ''GD''.
 
Si potranno anche utilizzare le risorse del API di ''GD''.
  
Per poter fruire in Gambas delle risorse della libreria ''GD'', è necessario installare e richiamare la libreria dinamica e condivisa: "''libgd.so.3.0.0''"
+
Per poter fruire in Gambas delle risorse della libreria ''GD'', è necessario installare e richiamare la libreria dinamica e condivisa: "''libgd.so.3.0.8'' "
 
 
  
 
Mostriamo un semplice esempio:
 
Mostriamo un semplice esempio:
  Library "libgd:3.0.0"
+
  Library "<FONT Color=darkorange>libgd:3.0.8</font>"
 
   
 
   
  <FONT Color=gray>' ''gdImagePtr gdImageCreateFromPng (FILE * infile)''
+
  <FONT Color=gray>' ''gdImagePtr gdImageCreateFromFile (const char *filename)''
  ' ''Creates an image.''</font>
+
  ' ''Read an image file of any supported.''</font>
  Private Extern gdImageCreateFromPng(infile As Pointer) As Pointer
+
  Private Extern gdImageCreateFromFile(filename As String) As Pointer
 
   
 
   
  <FONT Color=gray>' ''int gdImageGetPixel (gdImagePtr im, int x, int y)''</font>
+
  <FONT Color=gray>' ''int gdImageGetTrueColorPixel (gdImagePtr im, int x, int y)''
  Private Extern gdImageGetPixel(im As Pointer, x As Integer, y As Integer) As Integer
+
' ''Gets a pixel color always as truecolor value.''</font>
 +
  Private Extern gdImageGetTrueColorPixel(im As Pointer, x As Integer, y As Integer) As Integer
 
   
 
   
 
  <FONT Color=gray>' ''void gdImageDestroy (gdImagePtr im)''</font>
 
  <FONT Color=gray>' ''void gdImageDestroy (gdImagePtr im)''</font>
 
  Private Extern gdImageDestroy(im As Pointer)
 
  Private Extern gdImageDestroy(im As Pointer)
 
 
Library "libc:6"
 
 
<FONT Color=gray>' ''FILE *fopen(const char *__restrict __filename, const char *__restrict __modes)''
 
' ''Open a file and create a new stream for it.''</font>
 
Private Extern fopen(__filename As String, __mode As String) As Integer
 
 
<FONT Color=gray>' ''int fclose(FILE *__stream)''
 
' ''Closes the stream. All buffers are flushed.''</font>
 
Private Extern fclose(flstream As Pointer) As Integer
 
 
   
 
   
 
   
 
   
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
   Dim fl, imago as Pointer
+
   Dim imago as Pointer
 
   Dim i As Integer
 
   Dim i As Integer
    
+
  fl = fopen("<FONT Color=gray>''/percorso/del/file.png''</font>", "r")
+
   imago = gdImageCreateFromFile("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
 
+
  If imago == 0 Then Error.Raise("Errore !")
  imago = gdImageCreateFromPng(fl)
 
 
    
 
    
 
  <FONT Color=gray>' ''Individua il pixel ad esempio alle coordinate x=20, y=20 dell'immagine:''</font>
 
  <FONT Color=gray>' ''Individua il pixel ad esempio alle coordinate x=20, y=20 dell'immagine:''</font>
  i = gdImageGetPixel(imago, 20, 20)
+
  i = gdImageGetPixel(imago, 20, 20)
 
    
 
    
  Print "Il colore del pixel è: "; Hex(i, 6)
+
  Print "Il colore del pixel è: "; Hex(i, 6)
 
    
 
    
 
  <FONT Color=gray>' ''Va in chiusura:''</font>
 
  <FONT Color=gray>' ''Va in chiusura:''</font>
  fclose(fl)   
+
  gdImageDestroy(imago)
  gdImageDestroy(imago)
 
 
      
 
      
 
  '''End'''
 
  '''End'''
 +
Vedere: https://libgd.github.io/manuals/2.3.0/files/preamble-txt.html
  
  
Riga 115: Riga 116:
  
 
Per poter fruire in Gambas delle risorse di ''SDL'', è necessario installare e richiamare le seguenti librerie dinamiche condivise:
 
Per poter fruire in Gambas delle risorse di ''SDL'', è necessario installare e richiamare le seguenti librerie dinamiche condivise:
* "''libSDL2-2.0.so.0.2.0''"
+
* "''libSDL2-2.0.so.0.18.2'' "
* "''libSDL2_image-2.0.o.0.0.0''"
+
* "''libSDL2_image-2.0.so.0.2.3'' "
 
 
  
 
Mostriamo un semplice esempio:
 
Mostriamo un semplice esempio:
  Library "libSDL2-2.0:0.2.0"
+
  Library "<FONT Color=darkorange>libSDL2-2.0:0.18.2</font>"
 
   
 
   
 
  Public Struct SDL_Rect
 
  Public Struct SDL_Rect
Riga 164: Riga 164:
 
   next_ As Pointer
 
   next_ As Pointer
 
  End Struct
 
  End Struct
 
 
   
 
   
 
  Private Const SDL_INIT_VIDEO As Integer = 32
 
  Private Const SDL_INIT_VIDEO As Integer = 32
Riga 177: Riga 176:
 
   
 
   
 
   
 
   
  Library "libSDL2_image-2.0:0.0.0"
+
  Library "<FONT Color=blue>libSDL2_image-2.0:0.2.3"</font>
 
   
 
   
 
  <FONT Color=gray>' ''SDL_Surface * IMG_Load(const char *file)''
 
  <FONT Color=gray>' ''SDL_Surface * IMG_Load(const char *file)''
Riga 192: Riga 191:
 
   Dim r, g, b, a As Byte
 
   Dim r, g, b, a As Byte
 
    
 
    
  SDL_Init(SDL_INIT_VIDEO)
+
  SDL_Init(SDL_INIT_VIDEO)
 
    
 
    
  imago = IMG_Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
+
  imago = IMG_Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
  If IsNull(imago) Then Error.Raise("Errore nel caricamento del file immagine!")
+
  If IsNull(imago) Then Error.Raise("Errore nel caricamento del file immagine!")
 
    
 
    
  pxfmt = imago.format
+
  pxfmt = imago.format
  Print "Formato immagine: "; pxfmt.BitsPerPixel; " bit per pixel"
+
  Print "Formato immagine: "; pxfmt.BitsPerPixel; " bit per pixel"
 
    
 
    
  <FONT Color=gray>' ''Invividua il pixel di cui conoscere i colori RGBA costituenti:''</font>
+
  <FONT Color=gray>' ''Imposta un pixel, di cui conoscere i colori RGBA costituenti:''</font>
  x = 100
+
  x = 100
  y = 39
+
  y = 39
 
+
 
  dati = imago.pixels
+
  dati = imago.pixels
  dati += 4 * (x + imago.w * y)
+
  dati += (pxfmt.BitsPerPixel \ 4) * (x + imago.w * y)
 
+
 
  r = Byte@(dati)
+
  Print Hex(Int@(dati), 8)
  g = Byte@(dati + 1)
+
  r = Byte@(dati)
  b = Byte@(dati + 2)
+
  g = Byte@(dati + 1)
  a = Byte@(dati + 3)
+
  b = Byte@(dati + 2)
  Print "r: "; Hex(r, 2); "\ng: "; Hex(g, 2); "\nb: "; Hex(b, 2); "\na: "; Hex(a, 2);  
+
  a = Byte@(dati + 3)
 
+
  Print "r: "; Hex(r, 2); "\ng: "; Hex(g, 2); "\nb: "; Hex(b, 2); "\na: "; Hex(a, 2);  
  SDL_Quit()
+
 
 +
  SDL_Quit()
 
    
 
    
 
  '''End'''
 
  '''End'''
 
  
  
  
 
=Note=
 
=Note=
[1] Per analogia di argomento si segnala anche [[Individuare_i_colori_dei_pixel_di_una_immagine|questa pagina della Wiki]].
+
[1] Per analogia di argomento si segnala anche [[Individuare i colori dei pixel di una immagine]].

Versione attuale delle 22:03, 6 mag 2023

Mostriamo di seguito un paio di modalità per individuare il colore di un determinato pixel di un'immagine.


Uso delle sole risorse di Gambas

Volendo utilizzare le sole risorse di Gambas, si potranno adottare un paio di modalità.

Individuare le coordinate del pixel mediante la Classe "Image"

Si potrà individuare il pixel dell'immagine impostando le sue coordinate x,y con la Classe "Image".

Public Sub Button1_Click()

 Dim im As Image
 Dim nCol As Integer 

 im = Image.Load("/percorso/del/file/immagine")

' Individueremo il pixel dell'immagine mediante le sue coordinate x ed y (che ovviamente dovranno essere specificate):
 nCol = im[x, y]

 Print "Il numero decimale del colore del pixel è: "; nCol, "&h"; Hex(nCol, 8)

End

Verrà restituito il numero decimale del colore del pixel, determinato dalle coordinate x ed y all'interno dell'immagine.

Individuare il colore di un pixel di un'immagine cliccandoci sopra con il mouse

Mostriamo un esempio nel quale, cliccando su un'immagine inserita in una PictureBox, viene mostrato in una TextLabel il colore del pixel, nonché in console il corrispondente numero:

Private im As Image
Private PictureBox1 As PictureBox
Private label1 As Label
 

Public Sub Form_Open()
 
' Carichiamo l'immagine in una variabile di tipo "Image":
 im = Image.Load("/percorso/del/file/immagine")
 
 With Me
   .W = im.W
   .H = im.H + 50
   .Center
 End With
' Rendiamo la "PictureBox" delle medesime dimensioni del "Form" principale:
 With PictureBox1
   .X = 0
   .Y = 0
   .W = im.W
   .H = im.H
   .Image = im
 End With
 With label1 = New Label(Me)
   .X = 0
   .Y = PictureBox1.H + 10
   .W = Me.W
   .H = 35
 End With

End

Public Sub PictureBox1_MouseDown()
 
 Dim nCol As Integer

' Individuiamo le coordinate x ed y del puntatore del mouse, quando clicchiamo nella "PictureBox" sull'immagine:
 nCol = im[Mouse.X, Mouse.Y]
 
' Quindi otteniamo il numero del colore del pixel cliccato con il mouse...
 Print "Il numero del colore del pixel cliccato è: "; nCol, "&h"; Hex(nCol, 8)

' ...e mostriamo il suo colore nella "Label" posta sul Form:
 Label1.Background = nCol
 
End


Uso delle risorse della libreria Libgd

Si potranno anche utilizzare le risorse del API di GD.

Per poter fruire in Gambas delle risorse della libreria GD, è necessario installare e richiamare la libreria dinamica e condivisa: "libgd.so.3.0.8 "

Mostriamo un semplice esempio:

Library "libgd:3.0.8"

' gdImagePtr gdImageCreateFromFile (const char *filename)
' Read an image file of any supported.
Private Extern gdImageCreateFromFile(filename As String) As Pointer

' int gdImageGetTrueColorPixel (gdImagePtr im, int x, int y)
' Gets a pixel color always as truecolor value.
Private Extern gdImageGetTrueColorPixel(im As Pointer, x As Integer, y As Integer) As Integer

' void gdImageDestroy (gdImagePtr im)
Private Extern gdImageDestroy(im As Pointer)


Public Sub Main()
 
 Dim imago as Pointer
 Dim i As Integer

 imago = gdImageCreateFromFile("/percorso/del/file/immagine")
 If imago == 0 Then Error.Raise("Errore !")
  
' Individua il pixel ad esempio alle coordinate x=20, y=20 dell'immagine:
 i = gdImageGetPixel(imago, 20, 20)
  
 Print "Il colore del pixel è: "; Hex(i, 6)
  
' Va in chiusura:
 gdImageDestroy(imago)
   
End

Vedere: https://libgd.github.io/manuals/2.3.0/files/preamble-txt.html


Uso delle risorse della libreria SDL2

Si potrà fare uso anche delle risorse del API del sistema SDL

Per poter fruire in Gambas delle risorse di SDL, è necessario installare e richiamare le seguenti librerie dinamiche condivise:

  • "libSDL2-2.0.so.0.18.2 "
  • "libSDL2_image-2.0.so.0.2.3 "

Mostriamo un semplice esempio:

Library "libSDL2-2.0:0.18.2"

Public Struct SDL_Rect
  x As Integer
  y As Integer
  w As Integer
  h As Integer
End Struct

Public Struct SDL_Surface
  flags As Integer
  format As Pointer
  w As Integer
  h As Integer
  pitch As Integer
  pixels As Pointer
  userdata As Pointer
  locked As Integer
  lock_data As Pointer
  clip_rect As Struct SDL_Rect
  map As Pointer
  refcount As Integer
End Struct

Public Struct SDL_PixelFormat
  format As Integer
  palette As Pointer
  BitsPerPixel As Byte
  BytesPerPixel As Byte
  Rmask As Integer
  Gmask As Integer
  BMask As Integer
  AMask As Integer
  Rloss As Byte
  Gloss As Byte
  Bloss As Byte
  Aloss As Byte
  Rshift As Byte
  Gshift As Byte
  Bshift As Byte
  Ashift As Byte
  refcount As Integer
  next_ As Pointer
End Struct

Private Const SDL_INIT_VIDEO As Integer = 32

' int SDL_Init(Uint32 flags)
' Initializes the SDL library.
Private Extern SDL_Init(flags As Integer) As Integer

' void SDL_Quit(void)
' Clean up all initialized subsystems.
Private Extern SDL_Quit()


Library "libSDL2_image-2.0:0.2.3"

' SDL_Surface * IMG_Load(const char *file)
' Load an image from an SDL data source.
Private Extern IMG_Load(_file As String) As SDL_Surface


Public Sub Main()
 
 Dim x, y As Integer
 Dim imago As SDL_Surface
 Dim pxfmt As SDL_PixelFormat
 Dim dati As Pointer
 Dim r, g, b, a As Byte
 
 SDL_Init(SDL_INIT_VIDEO)
  
 imago = IMG_Load("/percorso/del/file/immagine")
 If IsNull(imago) Then Error.Raise("Errore nel caricamento del file immagine!")
  
 pxfmt = imago.format
 Print "Formato immagine: "; pxfmt.BitsPerPixel; " bit per pixel"
  
' Imposta un pixel, di cui conoscere i colori RGBA costituenti:
 x = 100
 y = 39
 
 dati = imago.pixels
 dati += (pxfmt.BitsPerPixel \ 4) * (x + imago.w * y)
 
 Print Hex(Int@(dati), 8)
 r = Byte@(dati)
 g = Byte@(dati + 1)
 b = Byte@(dati + 2)
 a = Byte@(dati + 3)
 Print "r: "; Hex(r, 2); "\ng: "; Hex(g, 2); "\nb: "; Hex(b, 2); "\na: "; Hex(a, 2); 
 
 SDL_Quit()
  
End


Note

[1] Per analogia di argomento si segnala anche Individuare i colori dei pixel di una immagine.