Individuare il colore di un determinato pixel

Da Gambas-it.org - Wikipedia.

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 riorse di Gambas, si potrà utilizzare semplicemente il seguente codice:

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
 

Public Sub Form_Open()

 Dim pc As Picture

' Carichiamo l'immagine in una variabile di tipo "Image"...
  im = Image.Load("/percorso/del/file/immagine")

' ...e la convertiamo in una "Picture":
  pc = im.Picture

' Rendiamo la "PictureBox" delle medesime dimensioni dell'immagine caricata:
  With PictureBox1
    .W = im.W
    .H = im.H
' Quindi carichiamo l'immagine, contenuta nella variabile di tipo "Picture", nella "PictureBox":
    .Picture = pc
  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:
  With Mouse
     nCol = im[.X, .Y]
  End With

' 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)

' ...nonché mostriamo il suo colore nella "TextLabel" posta sul Form:
  TextLabel1.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.0"


Mostriamo un semplice esempio:

Library "libgd:3.0.0"

' gdImagePtr gdImageCreateFromPng (FILE * infile)
' Creates an image.
Private Extern gdImageCreateFromPng(infile As Pointer) As Pointer

' int gdImageGetPixel (gdImagePtr im, int x, int y)
Private Extern gdImageGetPixel(im As Pointer, x As Integer, y As Integer) As Integer

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


Library "libc:6"

' FILE *fopen(const char *__restrict __filename, const char *__restrict __modes)
' Open a file and create a new stream for it.
Private Extern fopen(__filename As String, __mode As String) As Integer

' int fclose(FILE *__stream)
' Closes the stream. All buffers are flushed.
Private Extern fclose(flstream As Pointer) As Integer


Public Sub Main()
 
 Dim fl, immago as Pointer
 Dim i As Integer
 
  fl = fopen("/percorso/del/file.png", "r")
  
  immago = gdImageCreateFromPng(fl)
  
' Individua il pixel ad esempio alle coordinate x=20, y=20 dell'immagine:
  i = gdImageGetPixel(immago, 20, 20)
  
  Print "Il colore del pixel è: "; Hex(i, 6)
  
' Va in chiusura:
  fclose(fl)    
  gdImageDestroy(immago)
   
End



Note

[1] Per analogia di argomento si segnala anche questa pagina della Wiki.