• Publicidad

¿Cómo generar una imagen con Perl?

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

¿Cómo generar una imagen con Perl?

Notapor slopal » 2006-01-02 13:32 @605

Buenas otra vez :oops:

sigo con mi proyecto.. jeje necesito que me déis consejos de como hacer esto:

"dada un tamaño principal (numero de elementos de la cadena), el tamaño del elemento a buscar y las posiciones donde este elemento se encuentra en la cadena tengo que hacer una sencilla representación gráfica de la cadena principal marcando los elementos"

cómo buscarlo ya lo tengo, ahora sólo me falta cómo representarlo. la verdad es que nunca he trabajado con imágenes. He leido en los tutoriales y podría hacerlo utilizando "2 colores" y concatenando elementos y cuando llegue a la posicion en cuestion + tamaño_elemento pues coger otro color (hacerlo con imagenes pequeñitas).

Pero claro, el tamaño de la cadena que me den es aleatorio y como hago yo los "cuadraditos" de grandes para que la barra no quede ni muy grande ni muy pequeña en los casos extremos? Es un problema...

Lo ideal seria utilizar "algo" que me genere la imagen y pueda hacer un zoom o moverme por la barra pero es que no tengo ni ideaaaaaaa.

alguna sugerencia? No hace falta que sea super sofisticado eh. En Perl, o utilizando html dentro de perl, o... javascript:?: si es q se puede pudiera incluir dentro del perl como el html (ni idea todavia :()


Se acepta cualquier sugerencia... MUCHAS GRACIAAAAAAAAS!
slopal
Perlero nuevo
Perlero nuevo
 
Mensajes: 78
Registrado: 2005-11-23 11:41 @528

Publicidad

Re: ¿Cómo generar una imagen con Perl?

Notapor explorer » 2006-01-02 15:41 @695

Para representar las imágenes necesitas saber siempre el tamaño final del gráfico que vas a crear. Si tienes que representar una barra en, digamos, 700 puntos de ancho, pero esa barra en realidad está representando datos muchos mayores, tienes que hacer una reducción de los datos, o una regla de tres.

Ejemplo. Tu cadena de datos va desde el 0 hasta el 28000. Tu barra gráfica sólo tendrá 700 puntos de ancho. Eso quiere decir que cada pixel de ancho de la barra está representando 40 unidades de la cadena. Y si un tramo empieza en el valor 1400, quiere decir que tienes que pintarle en el pixel 35.

Una forma sencilla de hacer gráficos es utilizando la librería GD:
Código: Seleccionar todo
    1 #!/usr/bin/perl
    2
    3 use GD;
    4 use strict;
    5
    6 # Dimensiones de la barra
    7 my $barra_alto = 20;
    8 my $barra_ancho= 700;
    9
   10 # Dimensiones de la cadena
   11 my $cadena_largo= 28000;
   12
   13 # Relación cadena/barra
   14 my $r = $cadena_largo / $barra_ancho;
   15
   16 # Valores de los tramos encontrados, en la forma inicio => longitud
   17 # Los valores indicados aquí son con respecto a los valores de la
   18 # cadena, no de la barra a dibujar
   19 my %tramos = (
   20     2300 => 1240,
   21     4500 => 6500,
   22    13800 =>  900,
   23    25000 => 1500,
   24 );
   25
   26 # crear una nueva imagen
   27 my $img = GD::Image->new($barra_ancho,$barra_alto);
   28
   29 # definición de colores
   30 my $color_blanco = $img->colorAllocate(255,255,255);
   31 my $color_negro  = $img->colorAllocate(0,0,0);
   32 my $color_rojo   = $img->colorAllocate(255,0,0);
   33
   34 # hacer el fondo de color blanco, transparente e interlazado
   35 $img->transparent($color_blanco);
   36 $img->interlaced('true');
   37
   38 # Poner un borde negro alrededor de la barra
   39 $img->rectangle(0,0,$barra_ancho-1,$barra_alto-1,$color_negro);
   40
   41 # Para todos los tramos, pintamos rectángulos rellenos
   42 foreach my $inicio ( keys %tramos ) {
   43     my $longitud = $tramos{$inicio};
   44
   45     # Hacemos la cuenta para saber el tamaño del rectángulo a pintar
   46     # $x es el origen de dibujo del rectángulo, y
   47     # $w es su ancho
   48     my $x = $inicio   / $r;
   49     my $w = $longitud / $r;
   50
   51     # Pintamos el rectángulo relleno según el inicio y la longitud
   52     $img->filledRectangle($x,0,$x+$w,$barra_alto-1,$color_rojo);
   53
   54     # Alrededor del rectángulo ponemos un marco negro
   55     $img->rectangle($x,0,$x+$w,$barra_alto-1,$color_negro);
   56 }
   57
   58 # Grabación de la barra
   59 open my $fh, ">grafico.png";
   60 binmode $fh;
   61 print $fh $img->png;
   62 close $fh;
   63

En las líneas 7 y 8 definimos el tamaño de la barra a dibujar. Será un simple rectángulo.
En la 11, la longitud de la cadena, o dicho de otra forma, el valor máximo de nuestros valores a representar.
En la 14, calculamos cuantas unidades de la cadena representa cada pixel de la barra.
De la 19 a 24 metemos unos cuantos valores de prueba. Fíjate que son valores dentro del rango de la cadena, no de la barra.
En la 27, creamos la imagen.
De la 30 a la 32 creamos unos cuantos colores. El primer color definido de esta forma servirá además como color de fondo de la imagen.
En la 35 decimos que, además, ese color blanco sea transparente. Esto es opcional, claro, y se puede quitar.
En la 36, decimos que la imagen resultante se grabe con la opción de interlazado, para que los navegadores puedan presentar la imagen aunque no haya terminado de llegar completamente. Esta opción sólo es necesaria en gráficos muy grandes o conexiones a internet muy lentas.
En la 39 pintamos el rectángulo negro que bordea toda la imagen. Observa que las coordenadas empiezan en 0, por lo que el ancho y alto han de ser uno menos que los valores que tenemos.
De la 42 a la 56 tenemos un bucle por todos los tramos a representar que hemos metido de ejemplo antes en %tramos.
En la 43 extraemos el valor del tramo, mejor dicho, su longitud.
En la 48 y 49 transformamos los valores de $inicio y $longitud del espacio dentro de la cadena al espacio de nuestra barra. Una simple regla de tres.
En la 52 pintamos un rectángulo relleno según esos valores y en la siguiente la bordeamos en negro.
Finálmente, de la 59 a la 62 grabamos el resultado, en formato png.
El resultado lo puedes ver en: http://JoaquinFerrero.com/grafico.png
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor kidd » 2006-01-02 19:12 @841

Hola:

No entiendo muy bien que es lo que necesitas hacer, pero dentro del sitio hay un par de tutoriales que te podrían servir:
http://perlenespanol.com/archives-tut/000095.html
http://perlenespanol.com/archives-tut/000066.html


SALUDOS
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor slopal » 2006-01-02 20:00 @875

muchas gracias a los 2!!!

explorer creo que con tu solución me podré apañar :) ya te iré preguntando las dudas que me surjan. Muchas gracias te lo curras un monton!!

Por cierto, para utilizar GD hay que "añadirlo" al servidor? o normalmente ya está? Es que trabajo sobre un servidor que no es mío y no se si lo podré utilizar, de todas maneras mañana lo miro con más detalle. Muchísimas gracias!
slopal
Perlero nuevo
Perlero nuevo
 
Mensajes: 78
Registrado: 2005-11-23 11:41 @528

Notapor slopal » 2006-01-10 13:13 @592

bien, me lo he mirado y lo entiendo todo.

hoy por fin he podido probarlo. y OK, me crea la imagen... pero si la quiero mostrar como parte de una página html desde ese mismo script? No me deja :(

digamos q dspues de todo lo de antes tengo esto:

print"Content-type:text/html\n\n";
print"<html><head> <title>FREQ Results</title> </head>\n";
print"Aqui tenemos la imagen <br>";
print "<img src=\"grafico.png\" width=\"700\" height=\"20\">\n";


pero ejecuto y en la imagen me sale la tipica "crucecita" y si desde mozilla hago view image me sale:
Forbidden
You don't have permission to access /cgi-bin/freq/grafico.png on this server.


como se pueden modificar los permisos de un archivo mediante perl?
haciendo esto funcionara? o es que no se puede?

GRACIAAAAAAS :D
slopal
Perlero nuevo
Perlero nuevo
 
Mensajes: 78
Registrado: 2005-11-23 11:41 @528

Re: ¿Cómo generar una imagen con Perl?

Notapor explorer » 2006-01-10 14:09 @631

A ver... una cosa es que quieras sacar ese gráfico en tiempo real (creándolo en el momento con el programa) o primero generar el gráfico, guardarlo al lado de la página html correspondiente y luego referenciarlo con la marca <img>.

Del mensaje de error se deduce que estás en el primer caso. Has creado un cgi y dentro de él se genera el gráfico.

Lo que te falta es que crees una página html que llame a tu programa, en el lugar de la página donde quieres presentarlo:
Código: Seleccionar todo
<html>
<head> <title>FREQ Results</title> </head>
<body>
Aqui tenemos la imagen <br>
<img src="/cgi-bin/grafico.pl" width="700" height="20">
</body>
</html>

Esta página la guardas en cualquier parte de tu sitio web. Luego subes a la carpeta cgi-bin el grafico.pl. Cuando veas la página en el navegador, éste solicitará la imagen, y, al ser un gráfico, lo intentará dibujar.
Lo que falta de cambiar en el programa anterior es:
Código: Seleccionar todo
   58 # Presentación de la barra
   59 print "Content-type: img/png\n\n";
   60 binmode STDOUT;
   61 print $img->png;
   62


Cosa distinta es que quieras primero grabar la imagen (generarla) y luego presentarla dentro del html. Entonces primero ejecutas el programa, guardas la imagen al lado de la página html y agregas su nombre al src de la <img>.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor slopal » 2006-01-11 12:55 @580

gracias ya me funciona :)

es que aun no tenia muy claro el tema y estaba espesa... jeje


-------

por cierto, sabeis como lanzar estas líneas en perl? es que las necesito para poder utilizar el modulo GD del servidor en cuestion.
Por ahora y como chapucilla digamos que desde el html lanzo un primer CGI que es el siguiente (pero shellscript):

imatge.cgi

#!/bin/sh

LD_LIBRARY_PATH=/usr/local/freetype-2.0.5/lib
export LD_LIBRARY_PATH

/usr/usuaris/it/*Servidor*/cgi-bin/freq/imatge.cgi.pl


y desde este hago una llamada al de hacer el gráfico (.cgi.pl porque hice unos cambios...para diferenciarlos)
pero sería mucho más elegante incluir estas lineas (las de las librarys) en el que tiene todo el codigo de la imagen no? :roll:

graciasss


----

vale, nada ya he visto que se hace con system() :)
slopal
Perlero nuevo
Perlero nuevo
 
Mensajes: 78
Registrado: 2005-11-23 11:41 @528

Notapor slopal » 2006-03-08 12:39 @568

explorer escribiste:
Lo que te falta es que crees una página html que llame a tu programa, en el lugar de la página donde quieres presentarlo:
Código: Seleccionar todo
<html>
<head> <title>FREQ Results</title> </head>
<body>
Aqui tenemos la imagen <br>
<img src="/cgi-bin/grafico.pl" width="700" height="20">
</body>
</html>



Refloto este tema porque seguí tu consejo y me fue muy bien. Pude mostrar la imagen y tal.

El problema es que para llamar a grafico.pl necesito pasar unos parametros.

Yo lo hago asi:
Código: Seleccionar todo
print"<img src="\/cgi-bin\/freq\/carrega_moduls_imatge.cgi?mida_tupla=$mida_tupla&mida_cadena=$mida_cadena&posicions=$posicions_param&nom_fitxer=$nom_fitxer" width="1000" height="100">";



lo paso por GET pq es dela unica manera que encontre en su momento para pasarlo y me fue muy bien.. hasta que las variables q enviaba se hacen muuuuuuuuuuy grandes :( enonces me sale un error de el servidor no puede enviar URLS tan grandes...

se podria enviar por POST o de alguna otra manera para que no tuviera este problema?

Gracias!
slopal
Perlero nuevo
Perlero nuevo
 
Mensajes: 78
Registrado: 2005-11-23 11:41 @528

Re: ¿Cómo generar una imagen con Perl?

Notapor explorer » 2006-03-08 13:08 @588

Que yo sepa, un src de un img no genera una petición POST.
Se podría hacer con marcas invisibles en un formulario. Por ejemplo:
Código: Seleccionar todo
<form ...>
<input type="hide" name="..." value"...">
<input type="hide" name="..." value"...">
...
</form>
pero, recapitulemos...
Tu tienes un programa Perl que genera una página html, dentro de ella tiene una imagen que se genera con otro programa Perl...
¿Y no se podría hacer todo con un sólo programa Perl, con el primero?
El programa se encargaría de generar el HTML, generar y guardar el gráfico en el sistema de ficheros en un directorio temporal, y en el html sólo habría que poner una referencia a el.
Luego, otro proceso, periódicamente, podría revisar el directorio temporal y borrar los ficheros viejos.
Esto tiene la ventaja del llamado cacheo de imágenes generadas. Si compruebo antes de generarla que una imagen ya existe, no lo hago, le actualizo su fecha de modificaciòn (para que no sea borrado por el recolector de basura anterior) y genero el resto del html.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor slopal » 2006-03-13 10:50 @493

explorer escribiste:pero, recapitulemos...
Tu tienes un programa Perl que genera una página html, dentro de ella tiene una imagen que se genera con otro programa Perl...
¿Y no se podría hacer todo con un sólo programa Perl, con el primero?
El programa se encargaría de generar el HTML, generar y guardar el gráfico en el sistema de ficheros en un directorio temporal, y en el html sólo habría que poner una referencia a el.
Luego, otro proceso, periódicamente, podría revisar el directorio temporal y borrar los ficheros viejos.
Esto tiene la ventaja del llamado cacheo de imágenes generadas. Si compruebo antes de generarla que una imagen ya existe, no lo hago, le actualizo su fecha de modificaciòn (para que no sea borrado por el recolector de basura anterior) y genero el resto del html.


eso es lo q qeria hacer en un principio pero no me sale :( algo hare mal....

yo tengo mi web html q llama a un CGI q escribe cosas por pantalla (cosas q calcula) y que ademas pinta una imagen. (y esta imagen la crea en ese mismo momento con los datos que le han pasado y ha calculado, desde un programa perl).

Pero tenia dos problemas...
1) Tenía problemas al hacer un system (y por lo tando para llamar a cualquier programa perl de esa manera :()

el error es:
Insecure $ENV{PATH} while running with -T switch at /var/www-cgi/gralggen.lsi.upc.es/freq/freq.cgi line 345.
y tuve problemas con el tema d modificar la variable y los premisos y el servidor que no es mio

2) Si muestro la imagen pre-generada me da este error "You don't have permission to access /cgi-bin/freq/dades/grafic.png on this server" (que supongo que tendre que cambiarle el owner o algo asi al fichero... pero si no puedo hacer un system no se como hacerlo :(
slopal
Perlero nuevo
Perlero nuevo
 
Mensajes: 78
Registrado: 2005-11-23 11:41 @528

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados