Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Dibujar sobre una imagen. (https://www.clubdelphi.com/foros/showthread.php?t=36508)

toorbye 14-10-2006 16:10:37

Dibujar sobre una imagen.
 
Hola, me gustaría que me pudieseis guiar un poco .He leído bastantes hilos en el foro, pero aun así no me aclaro.
Me gustaría sobre una imagen (un mapa en bmp) cargada mediante un Timage, situar varios puntos (puntos de interés). Con el tiempo tendría que poder poner mas donde yo quisiera. Supongo que para poner los puntos tendré que utilizar la propiedad Canvas del TImage, pero aun así no me aclaro muy bien… La idea es mediante un click colocar en esa zona el punto de interés.
Supongo que las coordenadas de los puntos tendrán que ir guardadas en una base de datos, para que en las sucesivas veces, al cargar el programa aparezcan ya los puntos en las zonas indicadas.

A ver si me podéis guiar un poco y que ideas se os o curren, o si existe algún tipo de componente para manejar esto de forma sencilla. Por cierto probé con el simplegraph pero no me aclaro como poder dibujar los puntos sobre el mapa.

Un saludo y gracias

Lepe 15-10-2006 14:28:18

Si esos puntos debes poder borrarlos, editarlos, etc, considero muy oportuno guardar las coordenadas de los puntos. Otra opción es guardar el bitmap en un campo Blob, al rescatar la imagen, ya se ven los puntos, pero editar esos puntos es más "complejo".

Un punto de un solo pixel me parece casi imperceptible por el usuario, así que recomiendo una Elipse o bien un cuadrado, donde el centro de ese objeto, sea la coordenada a guardar.

Básicamente tienes que usar Canvas.Ellipsis para dibujar un punto redondo, o bien Canvas.Rectangle para dibujar un Cuadrado, si miras la ayuda, verás que tambien tienes que modificar las propiedades Canvas.Pen y Canvas.Brush ya que hay varios grosores de líneas (Pen) y varios formas de dibujar el cuadro (relleno completamente, a rayas horizontales, verticales, en diagonal, etc). Así como la forma de pintar (invirtiendo los colores, haciendo una mezcla del color de fondo con el color de la línea, superponer el color de la linea sobre el fondo, etc.

La mejor forma es haciendo un programita y probando todas las opciones.

Saludos

seoane 15-10-2006 16:55:24

1 Archivos Adjunto(s)
Aquí te dejo un pequeño juguete :) , arrastra con el ratón los símbolos de la derecha sobre la imagen para dibujarlos. En el código veras como dibujar círculos, cuadrados, lineas, etc.. entre otras cosas.

dec 15-10-2006 17:04:09

Hola,

Cita:

[Hint] ufrmMain.pas(144): Variable 'R' is declared but never used in 'TfrmMain.imgSimb01MouseUp'
Es una tontería. Me ha servido de excusa para decir que el ejemplo es fantástico como siempre Seoane. :)

seoane 15-10-2006 17:32:14

Parece que se me olvido hacer limpieza ;)

toorbye 16-10-2006 09:17:59

Muchas gracias a todos por vuestras respuestas, le voy a echar un ojo al ejemplo y ya os iré contando.

Un saludo

toorbye 16-10-2006 11:47:44

He avanzado un poco, y el principal problema que me encuentro ahora, es como poder borrar un determinado TImage situado ya sobre el mapa.

A ver si me podeis guiar en este tema, un poco. Gracias

seoane 16-10-2006 13:34:59

1 Archivos Adjunto(s)
Siguiendo con el ejemplo que propuse en este otro hilo, aquí te dejo este otro, puedes insertar cruces, equis y figuras simples (rectángulos, círculos). Puedes cargar una imagen como fondo, el mapa en tu caso. Puedes mover y eliminar los elementos una vez insertados. Y también puedes guardar y abrir las figuras en un archivo.

Creo que es bastante intuitivo, para seleccionar una figura haz clic sobre ella, para moverla arrastrala utilizando el ratón, para borrarla seleccionala y usa el menú "Editar" ... Bueno, echale un vistazo y me cuentas tus dudas.

toorbye 18-10-2006 08:40:56

Gracias Seoane por el ejemplo, muchisima gracias, por ayudarme.
Un saludo

oregon 18-10-2006 10:19:50

Con imagenes?
 
Me parece fantástica la posibilidad que se abre con los ejemplos 29 y 30 de seoane. Yo también ando metido en un problema parecido.
Necesito cargar una imagen (imagen de satelite) en un componente timage, y luego emplazar sobre ella dos tipos de puntos de los que más tarde necesito conocer sus coordenadas para realizar unos cálculos.
El caso es saber si es posible, en vez de dibujar, insertar un pequeño bmp (tipo icono) en el lugar deseado, y que luego se puedan mover para afinar o ajustar su posición. En realidad, no uno, sino tantos como se deseen.
Sería algo como que al pinchar sobre una opción del menu tipo "crear punto", se creara un timage, cargara una imagen pequeñita preestablecida, y permitiera colocarla únicamente sobre la imagen en la que se trabaja (como en los ejemplos), y que luego se pudiese desplazar o eliminar como en el ejemplo 30.
¿alguien sabe si es posible? ¿como? Se agradecen directrices!
Muchas gracias por vuestra ayuda y comentarios.

Ciao!

seoane 18-10-2006 13:34:25

Ese icono que quieres insertar, ¿seria siempre el mismo o cada icono puede ser diferente?, si son diferentes ¿seria un numero limitado de iconos preestablecidos o podría ser cualquier icono?. si solo es un icono la solución es inmediata, si es una lista de ellos podemos usar un TImageList para almacenarlos, pero si se puede insertar cualquier icono la cosa se complica, no es imposible, pero se complica.

oregon 18-10-2006 15:16:03

Gracias Seoane,

Se trata de usar únicamente dos iconos distintos, para marcar dos cosas distintas en la imagen de fondo.

he encontrado un programa demostrativo de algo parecido a lo que quiero hacer. Está disponible en la página web de Neftalí, y creo que es muy útil para esto, y creo que puede solucionar el problema.

De toda formas, tus ideas también son bienvenidas para resolver el asunto.

Gracias de nuevo,

seoane 18-10-2006 17:17:20

1 Archivos Adjunto(s)
Me alegro de que ya hayas resuelto el problema, sin embargo yo he seguido con el ejemplo un poco mas. Ahora en vez de usar arrays dinámicos uso TObjectList, y además ya se pueden insertar imágenes. También permite exportar la imagen resultante como un bmp.

Aquí te lo dejo, puede que te sirva, yo pido la ruta de la imagen cada vez que se quiere insertar una nueva, tu puedes usar el mismo método pero utilizando una ruta fija.

oregon 18-10-2006 18:36:27

Fantástico
 
Pues funciona de maravilla. Es exáctamente lo que quería. Me dedicaré a destripar el codigo fuente para ver si aprendo a programar de verdad :rolleyes: . Y a ver como lo aprovecho para mi programa.

La verdad es que da gusto este foro.

ciao!

oregon 02-11-2006 15:25:05

Coordenadas
 
Saludos,

Tras varios días pengándome con esto, creo que he conseguido apañarlo para mi aplicación. Muchas gracias seoane por los ejemplos.
Ahora tengo un par de problemas asociados. ¿cómo capturo las coordenadas de cada uno de los iconos pintados en runtime? Necesito pasar las coordenadas de cada uno de los iconos a un label o un stringgrid, pero no se como se llama cada uno de estos componentes creados en ejecución.

¿alguna idea?
Gracias!!

seoane 02-11-2006 15:50:41

En el ejemplo 31 cada una de las figuras se corresponde a un objeto creado en tiempo de ejecución e incluido en un TObjectList llamado Figuras. Pues bien si necesitamos saber las coordenadas de los objetos solo tenemos que recorrer la lista y para cada objeto revisar su propiedad BoundRect. Algo así:

Código Delphi [-]
var
  i: integer;
  Figura: TFigura;
begin
   for i:= 0 to Figuras.Count - 1 do
    begin
      Figura:= TFigura(Figuras[i]);
      with Figura.BoundsRect do
        Memo1.lines.add(Format('Left=%d,Top=%d,Right=%d,Bottom=%d',
          [Left,Top,Right,Bottom]));
    end;
end;

El código anterior es solo un ejemplo, se le pueden añadir un par de cosas. Por ejemplo si lo que quieres es el punto central puedes hacer algo como esto:
Código Delphi [-]
  x:= (Figura.BoundsRect.Left + Figura.BoundsRect.Right) div 2;
  y:= (Figura.BoundsRect.Top + Figura.BoundsRect.Bottom) div 2;

También puede ser que quieras diferenciar cada figura por separado, para eso añade a la clase TFigura un nombre, a la hora de crear una figura nueva tendrás que asignarle un nombre y luego dentro del bucle for solo tendrás que comprobar el nombre para saber cual es cada una.

oregon 02-11-2006 15:53:06

Fantástico
 
Muchas gracias,

creo que con esto ya puedo solucionar el problema.
Qué haría yo sin este foro!

fjcg02 06-12-2006 22:48:42

2 Archivos Adjunto(s)
Oregon,
estoy trabajando en algo similar, para permitir pintar rutas. La idea básica es utilizar ortofotos, y sobre ellas, marcar los puntos que se necesiten. Tengo el prototipo de las funciones de cálculo de coordenas utm y pintado de lugares tomando las coordenadas de una BBDD. En esta misma BBDD están incluidas las ortofotos.
Te paso el programa ( permite cargar cualquier ortofoto y referenciarla si sabes las coordenadas ), y que pinta los puntos. Concretamente estoy trabajando con la provincia de Bizkaia - Euskadi , pero valdría para cualquier zona de españa, ya que he sacado de la guia campsa las coordenadas utm de todas las poblaciones.En el ejemplo que incluyo sólo he dejado unas cuantas para que el archivo no pese demasiado.
Para utilizarlo, descomprime el proyecto en un directorio, y cambia el nombre del mdb a mapas.mdb
Para utilizarlo, tienes que conseguir una ortofoto, dar de alta el registro en la ventana gestón de mapas, darle las coordenadas utmx y utmy de la esquina inferior izquierda , el offset que es la distancia en metros del lado de la ortofoto, y cargar la propia foto.
Me parece que sólo he utilizado compenentes estandard, por lo que con D7 debiera compilar.
Creo que sólo funciona para el huso 30, pero para mi es suficiente.
Como ya te he indicado, el programa es un prototipo. Me queda encapsular todo en un mapa de escalado inferior para saltar a la foto de detalle. También me falta la gestión de las rutas, pero es más de lo mismo que ya tengo. La valiosa información que me han ofrecido desde este foro me ha servido muchísimo. También las respuestas a mis preguntas referentes a mapas a otros conocidos.
Temas a mejorar: pintado de lineas de referencia en las fotos, calculo de coordenas geodesicas ( latitud y longitud ) simultáneamente, posibilidad de importar rutas desde ficheros proporcionados por gps's, ... un montón de cosas que con tiempo, ....
Bueno, teniendo en cuenta que lo estoy haciendo para el grupo de jubilados en el que participa mi padre, para que tengan las salidas al monte en la bbdd y puedan preparar un fancine anual, pues ni tan mal.
Lo dicho, a poquitos, pues va saliendo el germen.
Si tienes tiempo de echarle un vistazo, si te parece interesante, si tienes algo que me pueda interesar y que te apetezca compartir ( compartir es amar :p ) pues estoy a tu disposición.
Un saludo
Nota: he actualizado el adjunto con un par de cosillas más incluidas

oregon 07-12-2006 15:57:40

Muchas gracias fjcg02,

POr lo que me cuentas tiene muy buena pinta. Sin embargo, tengo un pequeño problema. Trabajo con Turbo Delphi, y no puedo instalar componentes externos. Por eso, cuando intento compilar me dan error todos los componentes JV. ¿te importaría pasarme un ejecutable para ver como funciona? Así de paso te puedo hacer de "Beta-tester"
Mientras tanto me llevo el código fuente para repasarlo a fondo este largo fin de semana.

Respecto a mi aplicación, la verdad es que va muy retrasada, pero no tengo problema en dejarlo aquí para que puedas aprovechar algo. Si es que puedes aprovechar algo del código de un principiante como yo. Ahora no lo tengo aquí, pero lo dejaré lo antes posible.

Muchas gracias de nuevo fjcg02.
Un saludo,

fjcg02 07-12-2006 23:44:22

oregon,
no tengo problemas para pasarte el ejecutable, pero pesa un mega, y en esta página no se permiten archivos de ese tamaño. Si me indicas cómo hacertelo llegar, no tengo ningún problema.
Por otro lado, el unico objeto JV que tengo es un JvDBImage, para visualizar los jpgs de la bbdd y/o cargarlos. Lo que ocurre que el Tdbimage no me permite cargar jpg's directamente. Si cambias ese objeto, y 'trampeas' lo que esté asociado a él, no tendrás problemas en utilizar el código para compilar.
Por otro lado, he conseguido pintar las líneas de referencia sin problemas ( cuadricula sobre la foto) para tener referencias.
Espero que puedas darle caña al tema y que te valga el resto en caso de que no puedas compliar.
Un saludo
Por cierto, es un placer ayudar a cualquiera. He sido visitante de ese foro y he aprendido mucho, pero hasta hace poco casi no preguntaba ni intervenía. Parece que la edad me quita la timidez.


La franja horaria es GMT +2. Ahora son las 09:34:00.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi