Autor Tema: Calcular código para GLCD  (Leído 15299 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado Picavid

  • PIC12
  • **
  • Mensajes: 89
    • www.seguridomo.es
Calcular código para GLCD
« en: 20 de Noviembre de 2006, 13:08:53 »
Hola, perdonen mi ignorancia, pero se podría usar el control de Picture para leer un .bmp y poder sacar el código para un GLCD?.

  Supongo que habría que crear un picture p.e. de tamaño 64x128, darle escala, incluir o dibujar una imagen/texto, y luego leer pixel a pixel, creando un código.

  Hace poco compré un GLCD 64x128 y todavía no me he puesto con él, pero sólo empezar, ya vi que para poner cualquier gráfico, hay que empezar haciendo una plantilla, dibujar, y sacar muestreo en bytes de cada grupo de 8 pixels verticales. Es así no? En ese caso, sería mucho más fácil poder pintar en un cuadro Picture y que realice un muestreo.

  Alguien sabría como:
-Configurar el picture (escala)
-Dibujar dentro de él (con el ratón+click o lápiz)
-Sacar muestreo

Un saludo,
David Gomà

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calcular código para GLCD
« Respuesta #1 en: 20 de Noviembre de 2006, 19:16:44 »
Hola.
Mira, justamente hace unos dias hice algo parecido para fastyx.
Te adjunto el codigo fuente del programa que hice.

Con respecto a lo de dibujar, no es nada dificil. Debes usar los eventos mouse_down y mouse_move de un objeto picturebox y utilizar la instruccion pset (x,y), color del picturebox.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Picavid

  • PIC12
  • **
  • Mensajes: 89
    • www.seguridomo.es
Re: Calcular código para GLCD
« Respuesta #2 en: 21 de Noviembre de 2006, 00:58:53 »
Gracias BrunoF, eres un Crack. En pocos días montaré un circuito y esté programa me ahorrará un montón de horas.

Estoy empezando a ampliar mis conocimientos en VB6 con los libros de Anaya, pero me quedo justo. Estos ejemplos además de ser MUY PRÁCTICOS, también son muy instructivos.

Con tu permiso voy a tratar de añadirle un par de cositas que llevaba en la cabeza: -modificar el tamaño y posición de la imagen dentro del escenario y añadirle texto. Si lo consigo y sale bien lo cuento.

Una vez mas, muchas gracias y un saludo.

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: Calcular código para GLCD
« Respuesta #3 en: 21 de Noviembre de 2006, 01:19:31 »
Hola:

Felicidades y gracias por el trabajo bruno, a ver si lo pruebo a ver como me va con proton.  :mrgreen: :-/

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calcular código para GLCD
« Respuesta #4 en: 21 de Noviembre de 2006, 03:58:24 »
Gracias BrunoF, eres un Crack. En pocos días montaré un circuito y esté programa me ahorrará un montón de horas.

Estoy empezando a ampliar mis conocimientos en VB6 con los libros de Anaya, pero me quedo justo. Estos ejemplos además de ser MUY PRÁCTICOS, también son muy instructivos.

Con tu permiso voy a tratar de añadirle un par de cositas que llevaba en la cabeza: -modificar el tamaño y posición de la imagen dentro del escenario y añadirle texto. Si lo consigo y sale bien lo cuento.

Una vez mas, muchas gracias y un saludo.


Bueno, me alegro que te sirva. Agregale todo lo que desees. Yo lo hice como una herramienta basica para crear un array partiendo de una imagen.


Hola:

Felicidades y gracias por el trabajo bruno, a ver si lo pruebo a ver como me va con proton.  :mrgreen: :-/

Jejeje Gio, usalo. A ver si me terminas de explicar como se definen los elementos de un array en proton, y modifico(o lo modificas tu) el programa para que se pueda elegir el compilador.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Picavid

  • PIC12
  • **
  • Mensajes: 89
    • www.seguridomo.es
Re: Calcular código para GLCD
« Respuesta #5 en: 22 de Noviembre de 2006, 07:05:19 »
Hola BrunoF, ya tengo parte de la aplicación. Ya inserto una imagen en un picture en la posición y tamaño que le indique. Después puedes digitalizarla convirtiendo los colores a blanco y negro en la scala de pixels 128x64, pero al definir los puntos, lo hace con un punto redondo, y siempre se queda algo de fondo, entonces mi pregunta es: Como puedo harcer puntos cuadrados que me llenen el pixel entero?

Un saludo

« Última modificación: 22 de Noviembre de 2006, 07:08:57 por Picavid »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calcular código para GLCD
« Respuesta #6 en: 22 de Noviembre de 2006, 19:37:47 »
Hola Picavid.

Bueno, el control PictureBox de VB no maneja directamente formas cuadradas. Sólo permite punto(como bien dijiste, redondos), línea, círculo y elípse.

Para rellenar con un rectángulo un sector del PictureBox, tenes que utilizar la API de Windows:

Declara arriba de todo en el Formulario esto:

Código: Visual Basic
  1. Private Declare Function Rectangle Lib "GDI32.dll" ( _
  2.     ByVal hDC As Long, ByVal X1 As Long, ByVal Y1 As Long, _
  3.     ByVal X2 As Long, ByVal Y2 As Long) As Long

Esa es una llamada a una función de la librería gráfica de Windows y te va a permitir dibujar rectángulos(por lo tanto también cuadrados cuando el ancho sea igual al alto).

El rectángulo esta conformado por dos partes: El borde y un relleno(perímetro y superficie).
El color del borde viene dado por la propiedad ForeColor del control PictureBox al momento de dibujar el rectángulo.
El color del fondo viene dado por la propiedad FillColor del control PictureBox al momento de dibujar el rectángulo.
El tamaño del borde viene dado según el valor que tenga la propiedad DrawWidth del controlPictureBox al momento de dibujar el rectángulo.

Hay otras propiedades más a tener en cuenta:
Para que lo que dibujamos no se borre y permanezca dentro del HCD del control PictureBox, la propiedad AutoRedraw del mísmo debe estar puesta en TRUE.

Y las propiedades DrawMode, DrawStyle y FillStyle del PictureBox.
Cada una realiza una función distinta:

La propiedad DrawMode determina qué parámetro se utilizará para dibujar sobre el PictureBox. Recomiendo que en un principio lo dejes en 13(Copy Pen). Luego si quieres puedes experimentar lo que sucede al cambiar esta propiedad.

La propiedad DrawStyle no te va a servir de nada para el rectángulo. Por lo que estuve probando, no hay diferencia visible en el rectángulo al cambiar esta propiedad.

La propiedad FillStyle es importante. Para crear rectángulos rellenos, debes setearla a 0(Solid). Luego podes experimentar con los distintos valores de esta propiedad.

Según lo que he estado probando, la función Rectangle trabaja en unidad pixel. Por lo tanto, sería lógico setear la propiedad ScaleMode del PictureBox a 3(Pixels) para igualar las unidades de medición. Esto te va a facilitar el cálculo de las coordenadas X,Y a la hora de graficar los rectángulos sobre el PictureBox.

Luego si estás mas canchero con la función podes probar utilizar la función Scale del PictureBox y cambiar las escalas del mísmo a 128 horizontal y 64 vertical. Pero ojo que esto afectará la posición en la que se dibujan los rectángulos.

He descubierto que la función tiene ciertos BUGS. Puede que no te ocurran o puede que si.

Su uso es bastante simple:

Código: Visual Basic
  1. Picture1.ForeColor = vbBlue
  2. Picture1.FillColor = vbRed
  3. Picture1.FillStyle = vbFSSolid
  4. Rectangle Picture1.hDC, 10, 10, 120, 150

Saludos.

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Picavid

  • PIC12
  • **
  • Mensajes: 89
    • www.seguridomo.es
Re: Calcular código para GLCD
« Respuesta #7 en: 23 de Noviembre de 2006, 01:46:26 »
Hola BrunoF, gracias por la información. No sabía eso y los rectángulos los había hecho con líneas. Esto ahorra bastante código.

  Pero creo que no me expliqué del todo bien. Verás, una imagen vale mas que mil palabras:

  Te explico: La imagen entera es el Picture, que corresponderia a la GLCD. En este caso he seleccionado como fondo el verde claro. He insertado la imagen grande y la he digitalizado, y postiormente he insertado otra vez la imagen mas pequeña y la he dejado sin digitalizar. Como ves, quedan restos del color de fondo, ya que al hacer los puntos redondos, quedan las esquinitas. Mirando en el msdn: Trazar puntos, Conceptos de Visual Basic, hay un ejemplo con puntos cuadrados, pero no dice como hacerlos. Con lo que has expuesto, he intentado lo siguiente definir un minicuadrado con un pixel de diferencia (hDC, 10,10,11,11), pero en pantalla aparece como un punto redondo.

Saludos
« Última modificación: 23 de Noviembre de 2006, 01:52:05 por Picavid »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calcular código para GLCD
« Respuesta #8 en: 23 de Noviembre de 2006, 02:57:28 »
Hola Picavid.

Antes que nada te voy a advertir sobre un par de cosas:

Mi programa, como habras visto, posee un Image y un PictureBox.
Utilizo ambos ya que para agilizar las cosas, aprovecho la propiedad Strech del Image para acomodar el tamaño de la imagen a 64x128. Luego copio el contenido del Image al PictureBox. Por lo tanto, la lectura de los pixels se hace desde el contenido del PictureBox. Entonces, el Image ya no me sirve de nada una vez hecho, pero si me sirve el PictureBox.
No modifiques el contenido del PictureBox antes de que el programa haga el barrido, sino va a generar mal los valores del array(excepto que precisamente desees modificar el contenido antes de crear el array).






Bueno, voy a comenzar a suponer un par de cosas:

1)Supongo que el tamaño del control Image(el pequeñin del borde inferior derecho) tiene un ancho de 128 pixels y un alto de 64 pixels(ojo que en el programa que te pase tenía 132x68 y hay que corregir ese pequeño desfasaje).
2)Supongo que el PictureBox tiene un ancho y alto múltiplos del control Image(si no es asi(mi ojo milimetrado detecta que no es múltiplo) hacelos que sean múltiplos: ejemplo: 256x128 512x256, etc).

Basandonos en esto: supongamos que seguiste mi no tan sabio consejo de hacer el tamaño del PictureBox múltiplo del control Image.

Entonces asigná por ejemplo...
Image1.ScaleMode = vbpixels
Picture1.ScaleMode = vbpixels
Picture1.Width = Image1.Width*3 y
Picture1.Height = Image1.Width*3

¿Cuál fue tu error?

Detengamonos a ver un poco lo que hiciste:

Tomaste una imágen(la pequeñita) y la vas leyendo. En base a eso quieres crear una imágen monocromática y de mayor tamaño a la pequeñita.¡La imágen creció y sin embargo seguiste usando un tamaño de rectángulos de 1x1 pixel!

Por lo tanto, si agrandas el tamaño del grafico...¡DEBES AGRANDAR EL TAMAÑO DE CADA PIXEL(rectangulo)!

Si el dibujo grande es 4 veces mas ancho y alto que el pequeñito, pues entonces cada pixel del dibujo será en realidad un conjunto de 4x4 pixels. Por lo tanto, tus rectángulos deberán tener 4 pixels de ancho y 4 de alto cada uno.

¿Comprendiste?


Saludos...

« Última modificación: 23 de Noviembre de 2006, 03:05:37 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Picavid

  • PIC12
  • **
  • Mensajes: 89
    • www.seguridomo.es
Re: Calcular código para GLCD
« Respuesta #9 en: 23 de Noviembre de 2006, 15:04:12 »
Hola BrunoF,

  Haber, intento aclarme porque me pierdo.
  Primero, bebido a, como te dije, que quería poder dibujar, modificar y escribir, decidí hacer un nuevo programa.
    -En vez de poner un image y un picture, puse dos pictures, porque me liaba mucho. (no tengo idea si es mejor o peor)
    -El picture principal, tiene un tamaño en pantalla de 12.495 por 5.085, pero una resolución de 128x64. Esto lo he hecho usando ScaleWidth y ScaleHeight a 128 y 64 respectivamente. Estoy convencido de esto, porque todo el programa se basa en esta resolución, incluso cuando desplazas el mouse por encima te va indicando las coordenadas (Esto lo aprendí con lo que dijiste de MouseMove y MouseDown.
    -Para Insertar la imagen:
        TamW = finX - iniX      'Es tamaño a escala Width-ancho
        TamH = finY - iniY      'Es tamaño a escala Height-alto
        Picture1.PaintPicture Picture2.Image, iniX, iniY, TamW, TamH
      Con esto, inserto la imagen que tengo en Picture2 en la posición y tamaño que previamente he marcado con iniX,...,finY

  -Para dibujar (puntos o lineas). Tengo configurado en Form_Load:
         Picture1.DrawWidth = (Picture1.Width / 1950)
         Esto me define el tamaño del punto que ocupa mas o menos el pixel entero(Esto es lo que no tengo claro. Este valor lo he puesto aleatoriamente hasta cuadrarlo.).
         Luego ya, con la funcion mouse_down y mouse_move, puedo dibujar dentro del picture.
*****Y aquí está mi duda. Cuando pinto un pixel, pone un punto redondo y no puedo ponerlo cuadrado!!!****
         El pintado lo hago así:
         Picture1.PSet (pntX, pntY), colPixel
         
         Bien, si aqui uso Rectangle con diferencia entre puntos de 1,1, igualmente sale un punto redondo. Si es de tamaño ...p.e. 50x50, bien, aunque cambia la escala de pixels, pero bueno. Esto tampoco lo entiendo mucho.
         ¿Es esto lo que dices? Si es así, no hay otro método tan engorroso (calcular escala, tener que definir un punto con cuatro coordenadas, definir color de marco, color de relleno,...)?

      A pesar de todo, ya he comprovado que no hay problema. Una vez digitalizo (paso a dos colores en definición 128x64) y codifico (leo los bytes) la imagen con tu metodo (punto a punto. Es de color ...?),  grabo los bytes. Luego he puesto la función de decodificar, recupero ese archivo, me lo carga en el picture, y ... perfecto. No ha grabado nada de los restos de colores que quedaban en la imagen original. En realidad, esto era lo que me preocupaba.

  Ahora la única preocupación respecto a los puntos es simplemente como acabado/presentación, que merecería la pena corregir, pero si no se puede, no se puede, a buscar otro metodo...

  Perdona si no te entiendo, pero todavía estoy bastante pez!!!


  Saludos,

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calcular código para GLCD
« Respuesta #10 en: 24 de Noviembre de 2006, 00:18:13 »
Hola. No se en que parte no entendiste mi explicación. Me parece que no has captado la teoría que expuse por completo.
Te estas complicando mucho.
Aca te adjunto el programa que necesitas. Si bien no es 100% funcional, te va a servir a manera de explicacion practica.

Observa que el Picture2 que es el gigante, tiene su escala en Pixels, para utilizar la misma escala que usa la funcion Rectangle de la WINAPI.

No es necesario reescalar la imagen. Si la reescalas a 128x64, se te van a complicar los calculos ya que debes pasar de una escala USER(es decir, que la definis vos como lo hiciste segun lo que mencionas) a pixels para poder dibujar en la posicion correcta los rectangulos y su dimension.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Picavid

  • PIC12
  • **
  • Mensajes: 89
    • www.seguridomo.es
Re: Calcular código para GLCD
« Respuesta #11 en: 24 de Noviembre de 2006, 06:00:05 »
Hola BrunoF,
  Creo que no estamos hablando de lo mismo.  La imagen que adjunté, corresponde a un solo Picture. En ella coloqué la misma imagen dos veces a diferente escala y posición, y es ese picture grande sobre el que edito. Me interesa esto porque en un GLCD quiero, tanto poner una imagen como texto y/o dibujos a mano alzada.
  Bien, adjunto el programa (está sin depurar y a medias) y entenderás a lo que me refiero.
  Saludos
 

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calcular código para GLCD
« Respuesta #12 en: 24 de Noviembre de 2006, 08:43:21 »
Hola.
Estabamos hablando de lo mismo, pero aplicado a distintas cosas.
Este programa deberia solucionar tus dudas. Lamentablemente, te tocara cambiar el resto del programa, ya que ahora el Picture1 trabaja en escala de Pixels con un scalewidth multiplo de 128 y un scaleheight multiplo de 64.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Calcular código para GLCD
« Respuesta #13 en: 24 de Noviembre de 2006, 16:30:21 »
Está muy bien ese programa que estan haciendo ustedes BrunoF y Picavid.

Yo hice uno similar, el generador de caracteres para LCD y tuve el mismo problema que picdavid, el problema del punto redondo, parece que el método LINE no dibuja puntos cuadrados, o por lo menos no encontré la forma. Busqué y busqué la manera de trabajar con el picture dibujando al estílo paint, pero no encontré la manera.

Si miran el programa para dibujar imagenes para pantallas graficas que anda por aquí en el foro (el que dá el código en Basic), notaran que al dejar presionado el botón del mouse se mantiene la línea si recorren los pixeles.

así era que lo quería hacer, pero no pude :( y no me quedó más remedio que irme por el camino largo. Tomar un picturebox como un píxel y crear una matríz de control para 8 caracteres de 5x7 = 8x5x7 = 280 picturebox, claro para el programa de Picavid esto sería engorroso.

voy a seguir sus avances y ver si puedo usar esa api (Rectangle) que menciona BrunoF para manejar pixeles en un pictureBox.

PD: disculpenme si me pasé alguna explicación, que ya me pongo a leerla.

Salu2
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calcular código para GLCD
« Respuesta #14 en: 24 de Noviembre de 2006, 19:30:35 »
Hola PalitroqueZ.
Antes que todo, gracias.

Proba el ultimo programa que puse. presiona el click izquierdo y derecho sobre el picturebox. Creo que eso es lo que andas necesitando.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.


 

anything