Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Problema Con Control Picture
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Problema Con Control Picture 
 
Hola estoy programando con gambas2 en modo consola. Uso el componente gb.qt y realizo la siguiente rutina:

PUBLIC SUB Prueba_Imagen()
  
  DIM vValor AS Integer
  DIM hPicture AS Picture
  
  
  hPicture = NEW Picture(96, 24, 0)
  hPicture.Load("/home/fernando/INMOBILIARIA.bmp")
  hPicture.Save("/home/fernando/picture.bmp")
 

  
END
 


El resultado es una imagen llena de garabatos y líneas sin ningún sentido.
Supongo que algo estoy haciendo mal, pero no veo nada en la documentación que me explique adecuadamente como usar estos componentes.

También sobre un picture y usando la instrucción Draw, escribo un texto y salvo la imagen, cosa que me hace correctamente, pero la resolución que me da es muy baja y se ve bastante borroso, ¿hay forma de solucionar esto?. Pongo ejemplo.

PUBLIC SUB Imagen_Texto()
  
  DIM vValor AS Integer
  DIM hPicture AS Picture
  
  
  hPicture = NEW Picture(96, 24, 0)
  hPicture.Fill(Color.White)
  Draw.Begin(hPicture)  'inicio el draw con objeto de picture

  Draw.FillStyle = Fill.Solid
  Draw.FillColor = Color.Black    'indico color negro
  Draw.BackColor = Color.White
  Draw.Background = Color.White
  Draw.Font.Name = "Lucida"
  Draw.Font.Bold = TRUE
  Draw.Font.Italic = FALSE
  Draw.Font.Size = "10"
  Draw.Font.StrikeOut = FALSE
  Draw.Font.Underline = FALSE
  Draw.Text("HOLA", 5, 5, 10, 10)
  Draw.End
  hPicture.Save("/home/fernando/pictureTxt.jpg")


  
END
 



Gracias de antemano.
Un saludo
 



 
fdogilna - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control Picture 
 
fdogilna escribió: [Ver mensaje]

El resultado es una imagen llena de garabatos y líneas sin ningún sentido.


En mis pruebas no veo nada extraño. Podría ser algún problema con el formato bmp, no lo sé. Yo siempre uso png ó jpg, según para qué.
No obstante, prueba con este código, es otra forma de usar la clase estática Picture:

DIM hpic AS Picture

hpic = Picture[User.Home &/ "INMOBILIARIA.bmp"]
hpic.Save(User.Home &/ "picture.bmp")


Aquí hemos visto dos cosas: Cargamos una imagen en un objeto Picture, sin necesidad de instanciarlo con la sintaxis Picture["path_to_picture"] que devuelve directamente un objeto picture.
Lo segundo, un poco off-topic, es que usamos la clase User y su propiedad Home (User.Home) para devolver la ruta a la carpeta de usuario en cualquier máquina donde ejecutemos nuestra aplicación. También usamos "&/" para concatenar rutas y olvidarnos de pensar si hace falta la barra o no.


Citar:

También sobre un picture y usando la instrucción Draw, escribo un texto y salvo la imagen, cosa que me hace correctamente, pero la resolución que me da es muy baja y se ve bastante borroso, ¿hay forma de solucionar esto?. Pongo ejemplo.

' .....
  hPicture.Save("/home/fernando/pictureTxt.jpg")
' .....
 

Gracias de antemano.
Un saludo



Aquí estás guardando tu imagen en un fichero jpg. Si necesitas más nitidez, puedes indicar el nivel de calidad de 0 a 100 como 2º parámetro del método Save:

hPicture.Save("/home/fernando/pictureTxt.jpg", 100)


Eso mejorará algo la claridad del texto. También mejorará si usas un formato con menor compresión, como png. Aún así, las dimensiones que usas son muy pequeñas como para notarlo, a menos que hagas mucho zoom sobre la imagen.

Cuando haces esto:

DIM hPicture AS Picture  
 hPicture = NEW Picture(96, 24, 0)


estás generando un objeto Picture de 96 pixel de ancho por 24 de alto (el último parámetro es booleano, para indicar si es transparente o no. Como has puesto un 0, se interpreta como FALSE, por tanto NO es transparente).

¿Puede que lo veas borroso porque la imagen que generas es muy pequeña y lo estés aumentando con el zoom del visor que uses?

Saludos
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control Picture 
 
Gracias por la respuesta, haciéndolo de la forma que me indicas si funciona. No entiendo que no funcione con la opción .load.

Con respecto al tema que expuse sobre el texto, explico lo que quiero hacer por si me pueden dar alguna otra opción o forma de hacerlo.

Estoy realizando un panel de led´s con 96 led de ancho por 24 led de alto. Este panel interpreta la información a dibujar por medio de una comunicación serie donde recibe por medio de un protocolo determinado una información en bytes. Estos bytes, en función de que sus ocho bit esten en 0 o 1, se encenderán o apagarán los led´s correspondientes. Normalmente la información que representará este panel es un texto, ya sea de forma estática o en movimiento. También se representarán gráficos y/o caracteres especiales, etc...

Este panel lo controlo perfectamente desde un programa hecho en visual basic 6.0, basandome en un control PictureBox, en el cual pongo el texto en las coordenadas que deseo, y posteriormente leo todos los pixeles del control distingiendo entre el fondo blanco que sería mi led apagado 0,o color negro que sería mi led encendido 1 y genero el mensaje con los  bytes correspondientes. Si quiero que el texto se desplace, lo consigo por medio de la variación de las coordenadas donde pongo el texto y una consecución de creación y lectura del PictureBox.
Ahora y por exigencias del guión he de realizar esto mismo pero con base de LINUX, cosa que agradezco porque me esta haciendo conocer LINUX. Teniendo en cuenta que el equipo donde corre LINUX y en mi caso se encargará de controlar el panel no tendrá pantalla, trabajo en modo consola, estoy intentando controlar esto por medio del objeto Picture, ya que es instanciable y no me hace falta ponerle sobre un formulario. Además por las pruebas que he realizado es el único que he conseguido leer y escribir los puntos a forma de pixel.

Dim vPicture as Picture
Dim vValor as Integer

vPicture=new Picture(96,24,100)
vPicture.Fill(Color.White)
Draw.Begin(vPicture)
Draw.Point(x,y)   'Escribo un punto en las coordenadas
vvalor = vPicture.Image[x,y]   ' Leo un punto de las coordenadas
Draw.End
 


Pero el gran problema que tengo es la nitidez con el texto. Al insertar el texto con la instrucción Draw.Text y hacer toda la lectura de pixeles, la representación que me queda en el panel es catastrófica. En función del filtrado que le haga al color negro, para hacer más o menos restrictivo los pixeles que interpreto como encendidos, me sale o todo un borrón de led encendidos o letras incompletas. Esto es independiente del tamaño de la fuente y de la fuente, ya que con un tamaño de font mucho mayor, por ejemplo 15 o 20, los bordes de las letras siguen sin estar definidos.

En estos momentos estoy totalmente perdido, además la documentación que leo de estos controles es un poco escasa y la verdad es que no se por donde meterle mano.

Agradecería me pudierais ayudar o darme otro punto de vista para poder seguir, ya que no me resigno a pensar que este nuevo lenguaje no tenga mejores y más potentes opciones que el arcaico y obsoleto visualBasic6.0

Gracias y perdón por la parrafada, pero es la desesperación....
 



 
fdogilna - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control Picture 
 
En vez de usar *.bmp puedes utilizar *.png pero con un rango binario (2 colores). Así era como hacía mis prácticas de visión artificial
 



 
razaAztk - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuarioVer la galería personal del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control Picture 
 
Gracias, eso seria ideal, limitar a dos colores ya que en las pruebas que hago los bordes de las letras se quedan con azules y rojos y lo distorsiona todo. Podrías indicarme donde limito este rango. De todas formas ten en cuenta que no tengo la necesidad de llegar a guardar la imagen en ningún formato específico, ya que hago una lectura de los pixeles del Picture mientras está en memoria. O eso estoy creyendo que hago.

Un saludo.
 



 
fdogilna - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control Picture 
 
Hola

Ya veo lo que intentas hacer... pero puede ser más complicado de lo que parece.

Veamos, primero las diferencias entre el objeto picture y el objeto image, según el wiki oficial:

Picture: Esta clase representa un dibujo. El contenido se almacena en el servidor X (display), NO en la memoria de procesos.

Image: El contenido de la imagen se almacena en la memoria de proceso. Para obtener o establecer valores individuales de pixel, se puede entender la clase Image como un array bi-dimensional. Por ejemplo, Image[x, y] se refiere a la posición (x, y) de un determinado pixel dentro de la imagen.

Bien, por lo que veo estás accediendo (o convirtiendo) el objeto picture en objeto Image usando vvalor = vPicture.Image[x,y] y accediendo a la información de píxeles individuales. Correcto.

En mis pruebas (dibujando un rectángulo, para mayor facilidad) he notado que a veces me devuelve valores -1 ó 0, incluso por encima de 16000000...
Esto no sé a qué es debido, lo que parece claro es que un valor -1 indica que no hay valor de color para ese píxel y un valor superior a 0 indica el propio color. Pero si usas el negro (valor 0) para hacer la comparación y dado que por alguna extraña razón algunos píxeles devuelven 0 como valor, puede ocurrir lo que dices.

En cambio, si uso otro color y comparo los píxeles con exactamente ese valor (en mi caso he usado Color.DarkBlue, que devuelve 128 como valor de color de píxel) descarto la posibilidad de confundirlo con otra cosa... o eso creo!

Luego bastará con iterar por todos los píxeles de la imagen y si valen 128, encienden el led, y lo apagan en caso de cualquier otro valor.

pixel


Espero que sirva la idea para solucionar tu problema. Otra solución que se me ocurre sería hacer la imagen 4 veces más grande y una vez pintada, elaborar un algoritmo que evalúe grupos de 4 píxeles (2x2) y en función de su valor medio, darle un valor de 0 ó 1 y trasladarlo a tu matriz de puntos. Bastante más trabajo, pero podría ser la solución.

Saludos
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control Picture 
 
y no has pensado en leer los bmp en modo binario
 



 
codificador - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control Picture 
 
Hola, Jguardon, efectivamente as entendido lo que intento hacer. Sobre lo que me comentas, tienes razón con el tema del color, el negro puede ser un poco problemático.

Pero independientemente del color mi gran problema es el texto. Si hago un rectangulo como as probado en tus pruebas, la representación es muy exacta, pero cuando lo hago con texto es un fracaso. Para que se pueda ver de una forma gráfica, intenta reproducir lo que te indico:

 
PUBLIC SUB Imagen_Texto()
 
 DIM vValor AS Integer
 DIM hPicture AS Picture
 
 
 hPicture = NEW Picture(96, 24, 0)
 hPicture.Fill(Color.White)
 Draw.Begin(hPicture)  'inicio el draw con objeto de picture

 Draw.FillStyle = Fill.Solid
 Draw.FillColor = Color.Black    'indico color negro
 Draw.BackColor = Color.White
 Draw.Background = Color.White
 Draw.Font.Name = "sans"
 Draw.Font.Bold = TRUE
 Draw.Font.Italic = FALSE
 Draw.Font.Size = "7"
 Draw.Font.StrikeOut = FALSE
 Draw.Font.Underline = FALSE
 Draw.Text("HOLA", 0, 0)
 Draw.Rect(10, 10, 30, 8)
 Draw.End
 hPicture.Save(User.Home &/ "pictureTxt.png")

END
 


Una vez que tengas salvada la imagen, ábrela con el editor de imagenes GIMP y en archivo - guardar como, sálvalo como tipo de archivo Imagen x BitMap - guardar - exportar - guardar.
El resultado más o menos es como se ve en el panel, el rectangulo se ve bién, pero la letra está deformada, incompleta y en algunos casos emborronada.

Posiblemente el problema sea la fuente, pero he probado con varios tipos de fuentes y todas me dan un resultado parecido. También el problema puede ser que esta forma de escribir dentro de un Picture no sea la idonea y utilizando otro tipo de objeto sea más adecuado, pero no encuentro que objeto me da las opciones que necesito de poder leer todos los puntos a forma de pixeles o escribir en ellos.


Un saludo
 



 
fdogilna - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control Picture 
 
Para este tipo de cosas yo hubiese empleado python, que tiene buenas librerías de manipulación de imágenes, y de seguro que tu código te hubiese salido de unas cuantas lineas.

Lo de que te recomendé de usar *.png monocromático, fue porque no te había entendido que era lo que querías hacer. Pensé que querías "cargarle" una imagen a tu programa pa' que enviase la info a tu uC......... y pss si usas ese formato está bien pan, no? jeje.

Mira bro.............. creo ya logre hacer lo que quieres:

Para empezar para binarizar una imagen necesitas aplicarle un umbral........ pero pa' saber que umbral es el adecuado necesitas conocer el rango de valores (colores) disponibles; y en gambas se trabaja con 24 bits, por lo que el máximo valor (que es el color blanco) es el (2^24 - 1)=16777215.

Tons ya sabemos el rango y con eso le aplicamos el umbral adecuado, claro........ iterando en toda la imagen, y el primer valor es Image[0,0] (notar que se empieza en cero). Y otra cosa a saber que el primer elemento se refiere a la columna y el otro a la fila Image[columna,fila] (je, es como en matlab/octave, aunque creo es así por convención).

Modificando un leve tu código, mi solución es:

PUBLIC SUB Main()
 
 DIM vValor AS Integer
 DIM hPicture AS Picture
 DIM i AS Integer ' Indice para iterar en filas
 DIM j AS Integer ' Indice para iterar en columnas
 DIM fileResult AS File ' Fichero de texto a guardar info
  
 hPicture = NEW Picture(96, 24, 0)
 hPicture.Fill(Color.White)
 Draw.Begin(hPicture)  'inicio el draw con objeto de picture

 Draw.FillStyle = Fill.Solid
 Draw.FillColor = Color.Black    'indico color negro
 Draw.BackColor = Color.White
 Draw.Background = Color.White
 Draw.Font.Name = "sans"
 Draw.Font.Bold = TRUE
 Draw.Font.Italic = FALSE
 Draw.Font.Size = "7"
 Draw.Font.StrikeOut = FALSE
 Draw.Font.Underline = FALSE
 Draw.Text("HOLA", 0, 0)
 Draw.Rect(10, 10, 30, 8)
 Draw.End
 'hPicture.Save(User.Home &/ "pictureTxt.png")
 fileResult = OPEN (User.Home &/ "a.txt") FOR OUTPUT CREATE
 FOR i = 0 TO 23
   FOR j = 0 TO 95
     'PRINT #fileResult, hPicture.Image[i, j];;
     ' El rango de colores es de 0 -> (2^24 - 1)
     IF hPicture.Image[j, i] < 2796202 THEN ' Umbral a un sexto del rango
       PRINT #fileResult, "1";
     ELSE
       PRINT #fileResult, "0";
     ENDIF
   NEXT
   PRINT #fileResult, "\n";
 NEXT
 CLOSE fileResult
END
 

 



 
última edición por razaAztk el Domingo, 12 Septiembre 2010, 07:55; editado 1 vez 
razaAztk - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuarioVer la galería personal del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control Picture 
 
Ha ejecutado el ejemplo, cambiando en el archivo de texto "0" por espacio, queda asi:

pantallazo-1

Entiendo esto que dices:

Citar:
Para empezar para binarizar una imagen necesitas aplicarle un umbral........ pero pa' saber que umbral es el adecuado necesitas conocer el rango de valores (colores) disponibles; y en gambas se trabaja con 24 bits, por lo que el máximo valor (que es el color blanco) es el (2^24 - 1)=16777215.
 


No lo no entiendo de donde por que es un sexto en la comparacion: 2796202x6=16777212
IF hPicture.Image[j, i] < 2796202 THEN ' Umbral a un sexto del rango


¿no seria mas logico la mitad 16777215/2=8388607 ?

Lo he probado, y el resultado es mas confuso (peor)..

pantallazo-2

¿por que sigues el criterio de 1/6 del rango, tiene alguna explicación tecnica o es tu experiencia que con ese valor da mejor?

Saludos
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
última edición por jsbsan el Domingo, 12 Septiembre 2010, 10:35; editado 2 veces 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Problema Con Control MovieBox netking86 Controles/Librerías/Componentes 3 Domingo, 24 Enero 2010, 20:21 Ver último mensaje
netking86
No hay nuevos mensajes Problema Con El Control Frame victoria General 3 Martes, 02 Octobre 2012, 23:38 Ver último mensaje
Shell
No hay nuevos mensajes Problema Con El Control Scrollview jousseph Controles/Librerías/Componentes 13 Lunes, 08 Abril 2013, 14:39 Ver último mensaje
jousseph
No hay nuevos mensajes Problema Con Control MaskBox bhol Controles/Librerías/Componentes 3 Domingo, 29 Marzo 2015, 19:08 Ver último mensaje
bhol
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
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



  

 

cron