|
Página 1 de 2
|
Como Saber El Color De Un Pixel En Un DrawingArea
Autor |
Mensaje |
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
Como Saber El Color De Un Pixel En Un DrawingArea
En el siguiente post "Cómo Pintar Un Píxel En Un Drawing Area" (http://foro.gambas-es.org/viewtopic.php?f=4&p=30048#p30048) el amigo vuott nos ha resuelto ese problema.
Pero yo planteo lo inverso: tengo dibujado algo en un drawingArea, y necesito saber el color del pixel en una determinada coordenada dentro del drawing area. ¿para que sirve esto? Pues puede servir para comparar distintas imágenes y comprobar que cosas (pixeles) han cambiado de una a otra.
Saludos
|
#1 Lunes, 01 Febrero 2016, 22:05 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Como Saber El Color De Un Pixel En Un DrawingArea
En el siguiente post "Cómo Pintar Un Píxel En Un Drawing Area" (http://foro.gambas-es.org/viewtopic.php?f=4&p=30048#p30048) el amigo vuott nos ha resuelto ese problema.
Pero yo planteo lo inverso: tengo dibujado algo en un drawingArea, y necesito saber el color del pixel en una determinada coordenada dentro del drawing area.
" ... y entonces vuott separó las aguas ! "
Library "libX11:6.3.0"
Private Enum XYBitmap = 0, XYPixmap, ZPixmap
' Display *XOpenDisplay(char *display_name)
' Opens a connection to the X server that controls a display.
Private Extern XOpenDisplay(display$ As String) As Pointer
' unsigned long XAllPlanes()
' Returns a value with all bits set to 1 suitable for use in a plane argument to a procedure.
Private Extern XAllPlanes() As Long
' XImage *XGetImage(Display *display, Drawable d, int x, int y, unsigned int width, unsigned int height, unsigned long plane_mask, int format)
' Returns a pointer to an XImage structure.
Private Extern XGetImage(displayP As Pointer, d As Long, xI As Integer, yI As Integer, wid As Integer, hei As Integer, plane_mask As Long, formatI As Integer) As Pointer
' unsigned long XGetPixel(XImage *ximage, int x, int y)
' Returns the specified pixel from the named image.
Private Extern XGetPixel(ximage As Pointer, xI As Integer, yI As Integer) As Long
' XCloseDisplay(Display *display)
' Closes the connection to the X server for the display specified in the Display structure and destroys all windows.
Private Extern XCloseDisplay(displayP As Pointer)
Public Sub Form_Open()
DrawingArea1.Background = Color.White
End
Public Sub DrawingArea1_Draw()
Dim c As Integer[] = [Color.Blue, Color.Green, Color.Yellow, Color.Red]
Dim p As Float[] = [0, 0.34, 0.67, 1]
' Dibujamos dentro del "DrawingArea":
With Paint
.Brush = .LinearGradient(10, 40, 300, 40, c, p)
.Rectangle(10, 40, 300, 40)
.Fill
.End
End With
End
Public Sub Button1_Click()
Dim dsp As Pointer
Dim XImage As Pointer
dsp = XOpenDisplay(Null)
If IsNull(dsp) Then Error.Raise("Impossible conectarse al server X !")
' Conseguimos un Puntero a la "Estructura" contenente los datos de la imagen dibujada en el "DrawingArea":
XImage = XGetImage(dsp, DrawingArea1.Handle, 0, 0, DrawingArea1.W, DrawingArea1.H, XAllPlanes(), XYPixmap)
If IsNull(XImage) Then Error.Raise("Impossible obtener un 'Puntero' a los datos da la imagen del DrawingArea !")
' Mostramos el valor en esadecimale de un pixel puesto a las coordenadas establecidas en el 2° y 3° parámetro de la siguiente función:
Print Hex(XGetPixel(XImage, 290, 52), 8)
' Terminando:
XCloseDisplay(dsp)
End
última edición por vuott el Martes, 02 Febrero 2016, 13:42; editado 3 veces
|
#2 Martes, 02 Febrero 2016, 00:26 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
Re: Como Saber El Color De Un Pixel En Un DrawingArea
Vuott:
Gracias por tu pronta respuesta !!!
Saludos
|
#3 Martes, 02 Febrero 2016, 07:27 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
Re: Como Saber El Color De Un Pixel En Un DrawingArea
Vuott:
Problemas
Me sale el mensaje de ("Impossible obtener un 'Puntero' a los datos da la imagen del DrawingArea !")
Mi sistema es de 32 bits ¿puede ser por eso?
Nota:
Estoy usando gambas3.5.4 (aunque creo que eso da igual en este caso )
última edición por jsbsan el Martes, 02 Febrero 2016, 20:29; editado 1 vez
|
#4 Martes, 02 Febrero 2016, 20:24 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Como Saber El Color De Un Pixel En Un DrawingArea
Me sale el mensaje de ("Impossible obtener un 'Puntero' a los datos da la imagen del DrawingArea !")
uhmmm... a mi no da problema, pero recuerdo que un miembro del foro italiano obtenía el tu mismo problema.
Prueba cambiando la variable XYPixmap con esta: ZPixmap
saludos
|
#5 Martes, 02 Febrero 2016, 23:50 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Como Saber El Color De Un Pixel En Un DrawingArea
Vuott:
Citar:
Prueba cambiando la variable XYPixmap con esta: ZPixmap
¿ Aquí ?.
XImage = XGetImage(dsp, DrawingArea1.Handle, 0, 0, DrawingArea1.W, DrawingArea1.H, XAllPlanes(), XYPixmap)
¿ Por esto ?:
XImage = XGetImage(dsp, DrawingArea1.Handle, 0, 0, DrawingArea1.W, DrawingArea1.H, XAllPlanes(),ZPixmap )
Da el mismo error.
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#6 Miercoles, 03 Febrero 2016, 12:52 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Como Saber El Color De Un Pixel En Un DrawingArea
Da el mismo error.
Uhmmm... yo se que tú tambien tienes un sistema de 32-bit. ... podría ser esta la razón del problema.
Yo tengo un 64-bit, y en particular:
[System]
Gambas=3.8.90 r7601
OperatingSystem=Linux
Kernel=3.19.0-32-generic
Architecture=x86_64
Distribution=Linux Mint 17.3 Rosa
Desktop=GNOME
Theme=Cleanlooks
Language=it_IT.UTF-8
Memory=3952M
|
#7 Miercoles, 03 Febrero 2016, 14:26 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Como Saber El Color De Un Pixel En Un DrawingArea
Pedí ayuda para un test del codigo a un nuestro amigo del foro italiano. Él me dijo que el codigo funciona. Él tiene este sistema:
Gambas=3.8.4
Kernel=3.16.0-60-generic
Architecture=x86_64
Distribution=Ubuntu 14.04.3 LTS
última edición por vuott el Miercoles, 03 Febrero 2016, 23:48; editado 1 vez
|
#8 Miercoles, 03 Febrero 2016, 23:47 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Como Saber El Color De Un Pixel En Un DrawingArea
Buenos días!.
Hice una prueba de copiar una parte de una imagen pixel a pixel.
El código es este. En el drawingarea de la izquierda muestro la imagen y en el de la derecha, conociendo la imagen,
selecciono una parte con los dos bucle for para los dos ejes y muestro esa parte en el otro drawingArea.
' gambas class file
Private unaimagen As New Image
Public Sub Form_Open()
unaimagen = unaimagen.Load("buho100x100.png")
End
Public Sub MostarImagen()
Dim x, y As Float
Dim w, h As Float
Dim pincel As PaintBrush
x = 0
y = 0
w = unaimagen.W
h = unaimagen.H
pincel = Paint.Image(unaimagen)
pincel.Translate(x, y)
Paint.Brush = pincel
Paint.Rectangle(x, y, w, h)
Paint.Fill
End
Public Sub MostarParte()
Dim x, y As Float
Dim w, h As Float
Dim valorcolor As Integer
'Copiamos el horizontal y la mitad del vertical y la mostramos en el DrawingArea2
For y = 0 To unaimagen.H / 2
For x = 0 To unaimagen.W
valorcolor = unaimagen[x, y]
Paint.FillRect(x, y, 1, 1, valorcolor)
Next
Next
End
Public Sub drw1_Draw()
MostarImagen
End
Public Sub drw2_Draw()
MostarParte
End
Con tiempo haré una pregunta.
Aquí tenéis el código para probar. Es simple.
Saludos
Descripción: |
|
Descargar |
Nombre del archivo: |
CopiarPixelesImagen.tar.gz |
Tamaño: |
23.09 KB |
Descargado: |
29 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
CopiarPixelesImagen.tar.gz |
Tamaño: |
23.09 KB |
Descargado: |
29 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
CopiarPixelesImagen.tar.gz |
Tamaño: |
23.09 KB |
Descargado: |
29 veces |
=================== Gambas Básico
"No es un bug, es una característica no documentada"
última edición por Shell el Domingo, 07 Febrero 2016, 10:00; editado 1 vez
|
#9 Domingo, 07 Febrero 2016, 09:57 |
|
|
v3ctor
Analista Programador
Registrado: May 2013
Mensajes: 1786
Edad: 44 Ubicación: Uruguay
|
Re: Como Saber El Color De Un Pixel En Un DrawingArea
shell muy bueno, por este método se podría girar la imagen 90 120 grados etc, también efectuar los efectos reflejo horizontal y vertical, todo esto solamente manipulando la posición de los píxeles o mejor dicho cambiando su posición.
atentos los programadores que les gusta el manejo de imágenes ajjajaja.
=================== Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
|
#10 Domingo, 07 Febrero 2016, 15:59 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 2
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas No puede adjuntar archivos Puede descargar archivos No puede publicar eventos en el calendario
|
|
|
|
|