PDA

Ver la Versión Completa : Crear Imagen A Partir De Texto (x,y,z)


gusspagano
22-10-2012, 20:06:41
Que tal amigos,

Tengo un txt con una lista de puntos, cada línea del txt son las coordenadas x,y de cada punto y un valor z, que es el atributo que quiero poner en la imagen. El rango de valores de Z es pequeño, va de -32 a 95.5.

Gracias por su ayuda.

Casimiro Notevi
22-10-2012, 20:26:16
Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php)?, gracias por tu colaboración :)

gusspagano
22-10-2012, 20:42:35
Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php)?, gracias por tu colaboración :)

Si amigo, de hecho ya tengo algún tiempo de ser miembro.

roman
22-10-2012, 20:53:08
La recomendación de leer la guía es porque no queda claro cuál es tu problema. Necesitas deescribir mejor lo que quieres hacer.

// Saludos

gusspagano
22-10-2012, 21:04:46
La recomendación de leer la guía es porque no queda claro cuál es tu problema. Necesitas deescribir mejor lo que quieres hacer.

// Saludos


ahh bien, pensé que si, pero bueno, me explico mejor:

pues como mencioné, tengo un txt con coordenadas x,y, y un atributo z, según yo las coordenadas x,y pueden ser los números de columna y fila de cada pixel, y el valor de z el color de dicho pixel.

No sé si con ésto se pueda crear una jpg o una tiff, giff, algo por el estilo.

Tal vez no me doy a entender como quisiera, es algo que no había tenido necesidad de hacer hasta ahora.

Si alguien puede guiarme un poco le estaré muy agradecido.

Casimiro Notevi
22-10-2012, 21:10:38
¿Pero tú qué quieres hacer? :confused:
¿Sumar los valores de x y restarlos a los de y?, ¿crear una gráfica con cada uno de los puntos?, ¿simular los puntos en un "plano espacial"?, ¿averiguar la media de todos los números y el resultado apostarlo a la lotería? ;)

roman
22-10-2012, 21:17:13
Pues a ver, de que puedes, puedes. Necesitarías saber el máximo de X y el máximo de Y para así crear un bitmap vacío con esas dimensiones. Luego determinar a qué color corresponde la Z pues, en principio, un color se determina por tres números, no por uno sólo. Quizá, si usas una escala de grises...

Luego, usar la propiedad ScanLine del Bitmap para dibujar cada pixel en la posición indicada.

Pero, supongo que estás consciente de que eso te dará una imagen inentendible al ojo humano.

// Saludos

gusspagano
22-10-2012, 21:37:06
ok, si conozco los valores extremos de x y de y, entonces con esto creo un bitmap. Ahora, solo tengo un valor de Z, me parece que hay forma de determinar el color con un solo valor ¿o no?

Y bueno, la imágen que trato de crear es precipitación. Tengo el valor de lluvia para cada ubicación y ahorra quiero crear la imagen para darle mayor sentido visualmente, ya que no es lo mismo ver una tabla con un monton de números. Después de la tener la imagen, tal vez puda encimar un mapa de una ciudad o una cuenca, algo por el estilo. ¿Creen que se pueda o me voy a complicar demasiado?

bosster_018
22-10-2012, 21:59:45
No puede entender tu duda, pero por el título me hizo recordar un ejemplo que una vez postearon en el ClubDelphi titulado: "Código sin utilidad"

Y en ese Hilo muestran como dibujar un texto usando letras:

http://www.clubdelphi.com/foros/showthread.php?t=41240

Saludos

roman
22-10-2012, 22:21:56
Ahora, solo tengo un valor de Z, me parece que hay forma de determinar el color con un solo valor ¿o no?

Supongo que sí, si te restringes, por ejemplo, a 256 colores. Pero tienes, creo, que manejar una paleta de colores, o sea, decir a qué coor corresponde cada entero. Pero esto escapa de mis conocimientos.

// Saludos

gusspagano
22-10-2012, 22:37:34
Bueno, creo que tengo que invetigar algo sobre como asignar colores a los valores que tengo, y tambien sobre los bitmap.

Creo que el problema es demasiado simple para ustedes, tanto que teminan buscando mas allá, y terminan sin entender. La cuestion es como crear una imagen, eso es todo.

Gracias Roman, Casimiro Notevi, y bosster_018 por tu ayuda.

Casimiro Notevi
22-10-2012, 22:50:00
No es que sea muy simple para nosotros (ni muy dificil), el problema es que no has dicho exactamente qué es lo que quieres hacer. ¿Hacer una imagen?, ¿pero cómo quieres usar esos valores para crear una imagen?
Realmente parece que tienes los puntos para una proyección "3D", ya que pueden ser los valores x,y,z para una imagen de este tipo:

gusspagano
22-10-2012, 23:12:29
Pues si mi estimado Casimiro, lo que quiero es hacer una imagen, dónde según yo el valor de X me dice en qué columna estoy, el valor de Y me dice la fila, y el valor de Z No es una componente espacial, Z es el atributo, o sea, el valor con el cual voy a asignarle un color al pixel correspondiente.

El resultado seria una imagen 2D de 8 bits (0-255 colores, como dice Roman).

Ahora, no tengo por ejemplo, columna1 fila1, coluna1 fila2. Más bien tengo proyecciones (coordenadas UTM) x,y (latitud, longitud, por decirlo así) y mi Z son valores de reflectividad (perdón hace rato dije lluvia), que quiero representar mediante colores.

No tengo problemas en convertir mis proyecciones en valores de filas y columnas (si es que se requiere), lo que pasa es que no sé cómo se hace una imagen, ni cómo asignar colores a mis valores de Z.

Casimiro Notevi
22-10-2012, 23:15:20
Entonces, si te he entendido bien, te sirve un componente TChart, le puedes pasar los valores y elegir el tipo de gráfico además del color.
Échale un vistazo a ver si es lo que necesitas. No recuerdo en qué pestaña está :confused:

Delphius
23-10-2012, 00:01:27
Si dices que puedes asociar cada punto (X,Y) con el pixel (X,Y) de la imagen no debiera de ser problemas entonces de pintar dicho pixel.

Si buscas sobre Scanline() encontrarás varios hilos con muestras de código, Con ScanLine() te puedes posicionar en una fila determinada de la imagen. De hecho ScanLine() regresa un puntero al primer elemento de dicha fila. Ahora para moverse sobre las "columnas" basta con incrementar dicha cantidad de veces el puntero para acceder a dicho pixel en cuestión.

Por ejemplo: acceder al pixel (14, 50):

p := Picture.Bitmap.Scanline(14);
inc(p,50);

Ahora en el puntero p estamos en (14,50), recordando que en realidad el sistema de coordenadas en una imagen es (columna, fila).

Para pintar el pixel, si el formato es de 24bits (RGB) entonces:

p^[0] := tono_rojo;
p^[1] := tono_verde;
p^[2] := tono_azul;

Siendo tono_x un valor comprendido entre [0,255]. En lo que estoy dudando es si 0 correspondía al rojo o al azul. No estoy con delphi ahorita como para comprobar.

Tu problema es tu falta de criterio en determinar que color asociar a cada posible valor de Z. Naturalmente en última se resumirá en hacer alguna forma de relacionar el rango [Z-menor, Z-mayor] con el rango [color-min, color-max]. Pero no te podemos ayudar en eso... es algo que tu debes definirlo. Si tu idea es pintar un mapa con colores que distingan los niveles de precipitaciones debes entonces tu mismo definir que colores... Los colores habituales que usan la mayoría es verde, amarillo, naranja, rojo. y asocian entonces a cada uno ciertos rangos que estén entre los máximos y mínimos.

Como ves, eso ya no es cosa nuestra. sino tu falta de comprensión de como componer un color. Como he dicho: revisa los foros sobre Scanline(), y ni que decir... ¡estudia algo sobre RGB! El rojo se forma con (255,0,0) mientras que verde es (0,0,255), amarillo es (255,0,255) por mencionar algunos.

Si accedes mediante Scanline() debes descomponer la imagen en sus componentes RGB para formar el color... si accedes mediante Pixels[] lo accedes de forma numérica, el tipo cardinal para ser exacto, y no hay que "descomponerlo". Lee la ayuda sobre Pixels[].... básicamente el rango de cardinal se hace corresponder a los posibles colores... está pensado de modo tal que en su representación hexadecimal sea $RRGGBB.
Se recomienda ScanLine() por sobre Pixels ya que es más rápido, sobre todo en imágenes enormes.

Saludos,

gusspagano
23-10-2012, 00:16:50
Buena tu explicación.

Entonces es como decia roman, usar un bitmap, y luego ScanLine para moverme. Y pues no es falta de criterio al asignar color, pasa que no sabía como hacerlo, pero ps ya está, ahora lo sé.

Gracias Delphius.

Delphius
23-10-2012, 00:31:08
Buena tu explicación.

Entonces es como decia roman, usar un bitmap, y luego ScanLine para moverme. Y pues no es falta de criterio al asignar color, pasa que no sabía como hacerlo, pero ps ya está, ahora lo sé.

Gracias Delphius.

Determinar el color con un único valor de forma directa es imposible, salvo que la imagen la hagas a escala de grises (8 bits). Para eso se pinta el cada canal RGB con el mismo valor y se obtendrá una imagen con tonos de grises.
Aunque como he dicho: eso no resuelve el problema en realidad, porque de todas formas sigues en la misma... únicamente que ahora es [Z-min, Z-max] => [0,255] x RGB.

Ya sea a colores, o en grises no hay forma tan directa. Lo de generar una paleta de colores lo veo un tanto engorroso. Hace un tiempo (http://www.delphiaccess.com/forum/trucos-y-consejos-16/como-crear-una-imagen-de-escala-de-grises-a-8bits-reales/msg48029/#msg48029) tuve que explorar el tema de como utilizar la paleta. Basicamente la idea es asociar a un conjunto de valores [0,maximo] una relación al esquema RGB, se crea la paleta y se la asocia al TBitmap. De modo que el TBitmap por si mismo "pinte" la imagen con dicha paleta. Para este caso no le veo demasiada utilidad... cuando lo que se busca es justamente crear una imagen de cero.

Saludos,

gusspagano
23-10-2012, 22:49:33
Bueno, creo que tengo que ponerme a hacer pruebas. Dado que es la primera vez que lo haré, no tengo mucho que decir realmente, hasta que haga el intento, les agradezco a todos su ayuda.

Saludos.