Foros del Web » Programando para Internet » PHP »

Posicionar texto en captcha

Estas en el tema de Posicionar texto en captcha en el foro de PHP en Foros del Web. Tengo un problema, Estoy usando el codigo de generar captcha de las FAQS del foro, y resulta que al ponerle el tipo de letra, esta ...
  #1 (permalink)  
Antiguo 20/02/2008, 06:45
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Posicionar texto en captcha

Tengo un problema,

Estoy usando el codigo de generar captcha de las FAQS del foro, y resulta que al ponerle el tipo de letra, esta se ve un poco cortada por arriba, (segun que caracteres).

He probado modificando varios valores del codigo pero lo unico que consigo es ampliar el contenido de la caja donde va el texto y no mover el texto hacia abajo..

Se hacer mas grande y mas ancho la imagen, e incluso mover hacia la derecha el texto, pero lo que quiero es bajarlo de arriba, pues esta pegado ahi.

Como lo hago? Hay alguna forma de centrar el texto dentro de la imagen?

Gracias!
  #2 (permalink)  
Antiguo 20/02/2008, 09:44
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Posicionar texto en captcha

Si estas usando imagetfttext, el 4to parámetro es la posición X, incrementa este valor y el texto bajara en la imagen.

Saludos.
  #3 (permalink)  
Antiguo 20/02/2008, 10:37
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Re: Posicionar texto en captcha

Cita:
Iniciado por GatorV Ver Mensaje
Si estas usando imagetfttext, el 4to parámetro es la posición X, incrementa este valor y el texto bajara en la imagen.

Saludos.
Código PHP:
<?php
// Iniciamos uso de sesiones ...
session_start(); 

//recogemos el texto por el URL que enviamos a generar desde el link de imagen del HTML de nuestro formulario
$codigo=$_SESSION['mipass'];

//nombres tipografías a usar (sin extensión .ttf)
$tipografias = array("arial","comic","times");

//directorio donde estén las fuentes (ruta absoluta) importante el último /
$tipografias_ruta "C:\WINDOWS\Fonts\\";
// $tipografias_ruta="/home/sito/public_html/fonts/"; linux

//inicializa eje X desde donde se empezará a dibujar el código (referente al tamaño de la caja)
$espacio 0;

//tamaño fuente.
$tamano_fuente 15;

//profundidad caracteres/digitos del código a generar (password).
$profundidad_codigo 8// (alfanuméricos)

//cálculo Ancho automático de la caja

$x=$profundidad_codigo*$tamano_fuente;
$y=$tamano_fuente;

// Iniciar la generación de la imagen. Se define una caja de $x por $y pixels.
$im imagecreate($x$y);

//definición Colores. Expresados en valores R G B (respectivamente).
$color_fondo imagecolorallocate($im000); // Blanco
$color_texto imagecolorallocate($im255255255); // Negro

for($caracter=0$caracter<$profundidad_codigo$caracter++){
  
//seleccion de una tipografía aleatoria.
  
$indice_aleatorio=array_rand($tipografias);
  
$tipografia=$tipografias_ruta.$tipografias[$indice_aleatorio].'.ttf';

  
//generar el caracter gráfico.
  
imagettftext($im$tamano_fuente0$espacio$tamano_fuente$color_texto$tipografia $codigo{$caracter});
  
//separación entre caracteres
  
$espacio +=$tamano_fuente;
}

//cabecera HTTP la cual indica al navegador que la imagen que estamos generando es .PNG
header('Content-type: image/png');

//genera un png dinámico
imagepng($im);
//destruye la imagen del servidor
imagedestroy($im);
?>
Te refieres al $espacio? pues si modificas el $espacio se me juntan todas las letras en una sola :S

Puedes probarlo?

Merci
  #4 (permalink)  
Antiguo 20/02/2008, 10:44
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Posicionar texto en captcha

Ve la documentación de PHP el orden de los parámetros para imagetfttext.

Saludos.
  #5 (permalink)  
Antiguo 20/02/2008, 12:47
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Re: Posicionar texto en captcha

Cita:
Iniciado por GatorV Ver Mensaje
Ve la documentación de PHP el orden de los parámetros para imagetfttext.

Saludos.
Por mas que leo la documentacion... no me funciona...

Código PHP:
<?php
// Iniciamos uso de sesiones ...
session_start(); 

//recogemos el texto por el URL que enviamos a generar desde el link de imagen del HTML de nuestro formulario
$codigo=$_SESSION['mipass'];

//nombres tipografías a usar (sin extensión .ttf)
$tipografias = array("arial","comic","times");

//directorio donde estén las fuentes (ruta absoluta) importante el último /
$tipografias_ruta "C:\WINDOWS\Fonts\\";
// $tipografias_ruta="/home/sito/public_html/fonts/"; linux

//inicializa eje X desde donde se empezará a dibujar el código (referente al tamaño de la caja)
$espacio 0;

//tamaño fuente.
$tamano_fuente 15;

//profundidad caracteres/digitos del código a generar (password).
$profundidad_codigo 8// (alfanuméricos)

//cálculo Ancho automático de la caja

$x=150;
$y=40;

// Iniciar la generación de la imagen. Se define una caja de $x por $y pixels.
$im imagecreate($x$y);

//definición Colores. Expresados en valores R G B (respectivamente).
$color_fondo imagecolorallocate($im000); // Blanco
$color_texto imagecolorallocate($im255255255); // Negro

for($caracter=0$caracter<$profundidad_codigo$caracter++){
  
//seleccion de una tipografía aleatoria.
  
$indice_aleatorio=array_rand($tipografias);
  
$tipografia=$tipografias_ruta.$tipografias[$indice_aleatorio].'.ttf';

  
//separación entre caracteres
  
$espacio +=$tamano_fuente;
 
  
//generar el caracter gráfico.
  
imagettftext($im$tamano_fuente0$espacio$tamano_fuente$color_texto$tipografia $codigo{$caracter});
  
imagefttext($im$tamano_fuente01020$color_texto$tipografia$codigo{$caracter}); 
  
}

//cabecera HTTP la cual indica al navegador que la imagen que estamos generando es .PNG
header('Content-type: image/png');

//genera un png dinámico
imagepng($im);
//destruye la imagen del servidor
imagedestroy($im);
?>
La parte que he añadido...

Código PHP:
imagefttext($im$tamano_fuente01020$color_texto$tipografia$codigo{$caracter}); 
Esto es lo que dice la documentación...

Código:
array imagefttext  ( resource $image  , float $size  , float $angle  , int $x  , int $y  , int $col  , string $font_file  , string $text  [, array $extrainfo  ] )
Pues resulta que tal y como lo tengo puesto me genera dos codigos, el de antes que lo genera bien, pero pegado arriba y este nuevo... que lo genera en el sitio que le digo (10, 20) pero no genera bien el codigo!!!

Entonces ya no se como eliminar el primer codigo, y poner el segundo bien... como toca.

Una ayuda por favor...
  #6 (permalink)  
Antiguo 20/02/2008, 13:12
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Posicionar texto en captcha

Solo quita la primera llamada a imagetfttext y con eso no saldrá repetido.

Saludos.
  #7 (permalink)  
Antiguo 20/02/2008, 14:08
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Re: Posicionar texto en captcha

Cita:
Iniciado por GatorV Ver Mensaje
Solo quita la primera llamada a imagetfttext y con eso no saldrá repetido.

Saludos.
Cierto ya no sale duplicado, pero sigue monstrandose todas las letras juntas en una misma posición.

En cambio con la otra linea te mostraba el codigo bien, porque pasa esto?

Esta bien la linea ???

imagefttext($im, $tamano_fuente, 0, 10, 20, $color_texto, $tipografia, $codigo{$caracter});


Gracias GatorV
  #8 (permalink)  
Antiguo 20/02/2008, 15:51
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Posicionar texto en captcha

El problema es que tu le estas dejando la coordenada en $y fija, por eso se pone todo en un mismo lado.

Saludos.
  #9 (permalink)  
Antiguo 21/02/2008, 00:30
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Cita:
Iniciado por GatorV Ver Mensaje
El problema es que tu le estas dejando la coordenada en $y fija, por eso se pone todo en un mismo lado.

Saludos.
Weeeeeeeeeeeeeeeeee funcionaaaaaaaa, muchas gracias GatorV, eres un crack!

Siempre ahi, dando consejos! un 10 para ti

Lo que tengo ahora es que algunas fuentes son un poco suaves y a penas se ve tu contorno.

Sabes si existe algo para transformar la letra a negrita/Bold ?

Sino, cambiaré el tipo de letra y punto...

Gracias de nuevo

He conseguido mover las letras de forma aleatoria haciendo un angulo aleatorio para cada letra.

Ahora me gustaría añadirle lineas a la imagen, tipo moneybookers.
Horizontales y verticales, sé hacerlo pero de forma fija... y me gustaría que el fondo cambiase cada vez que se recargara el captcha.

Como puedo hacerlo? :S

Merci !!!!!

Última edición por GatorV; 21/02/2008 a las 09:26
  #10 (permalink)  
Antiguo 21/02/2008, 09:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Posicionar texto en captcha

Tendrías que usar la función imageline para dibujar las lineas en tu imagen, y para que fueran aleatorias usar rand() y jugar con las coordenadas para que estas se muevan cada que recargues el captcha.

Saludos.
  #11 (permalink)  
Antiguo 21/02/2008, 11:38
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Re: Posicionar texto en captcha

Cita:
Iniciado por GatorV Ver Mensaje
Tendrías que usar la función imageline para dibujar las lineas en tu imagen, y para que fueran aleatorias usar rand() y jugar con las coordenadas para que estas se muevan cada que recargues el captcha.

Saludos.
Por fin tengo mi captcha como dios manda!!!!!!

Muchas gracias GatorV!
  #12 (permalink)  
Antiguo 21/02/2008, 11:40
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Posicionar texto en captcha

Seria bueno que pusieras tu código completo para complementar el código que esta en las FAQs.

Saludos.
  #13 (permalink)  
Antiguo 21/02/2008, 14:33
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Re: Posicionar texto en captcha

Cita:
Iniciado por GatorV Ver Mensaje
Seria bueno que pusieras tu código completo para complementar el código que esta en las FAQs.

Saludos.
gen_codigo.php
Código PHP:
<?php
function genera_password($longitud,$tipo="numerico"){

if (
$tipo=="alfanumerico"){
$exp_reg="[^A-Z0-9]";
} elseif (
$tipo=="numerico"){
$exp_reg="[^0-9]";
}

return 
substr(eregi_replace($exp_reg""md5(time())) .
eregi_replace($exp_reg""md5(time())) .
eregi_replace($exp_reg""md5(time())),
0$longitud);
}
?>

gen_imagen.php
Código PHP:
<?php
// Iniciamos uso de sesiones ...
session_start(); 

//recogemos el texto por el URL que enviamos a generar desde el link de imagen del HTML de nuestro formulario
$codigo=$_SESSION['mipass'];

//nombres tipografías a usar (sin extensión .ttf)
$tipografias = array("fuente1","fuente2");

//directorio donde estén las fuentes (ruta absoluta) importante el último /
$tipografias_ruta "C:\WINDOWS\Fonts\\";
// $tipografias_ruta="/home/sito/public_html/fonts/"; linux

//inicializa eje X desde donde se empezará a dibujar el código (referente al tamaño de la caja)
$espacio 0;

//tamaño fuente.
$tamano_fuente 20;

//profundidad caracteres/digitos del código a generar (password).
$profundidad_codigo 6// (alfanuméricos)

//cálculo Ancho automático de la caja
$x=150;
$y=40;
$angmax 20;
$hori 50;
$verti 100;
// Iniciar la generación de la imagen. Se define una caja de $x por $y pixels.
$im imagecreate($x$y);


//definición Colores. Expresados en valores R G B (respectivamente).
$color_fondo imagecolorallocate($im255255255); // Blanco
$color_texto imagecolorallocate($im000); // Negro

for($caracter=0$caracter<$profundidad_codigo$caracter++){
    
$rhori rand(-$hori$hori);
    
$rverti rand(-$verti$verti);
    
// intento de lineas
    
$lineColor imagecolorallocate($im000);
    
$lineColor2 imagecolorallocate($im000);
    
imagefill($im00$color_fondo);
    
//imageline( imagen, separacion izq, separacion superior, largo, inclinacion)

    //linias horizontales
    
imageline($im0$rhori200$rhori$lineColor);
    
imageline($im0$rhori+20200$rhori+20$lineColor);
    
// linias verticales, 
    
imageline($im$rverti025700$lineColor);
    
imageline($im$rverti+20025700$lineColor);

}


for(
$caracter=0$caracter<$profundidad_codigo$caracter++){
  
//seleccion de una tipografía aleatoria.
  
$indice_aleatorio=array_rand($tipografias);
  
$tipografia=$tipografias_ruta.$tipografias[$indice_aleatorio].'.ttf';

  
//separación entre caracteres
  
$espacio +=$tamano_fuente;
  
$ang rand(-$angmax$angmax); 
  
//generar el caracter gráfico.
  //imagettftext($im, $tamano_fuente, 0, $espacio, $tamano_fuente, $color_texto, $tipografia , $codigo{$caracter});
  
imagefttext($im$tamano_fuente$ang$espacio30$color_texto$tipografia$codigo{$caracter});
  
}

//cabecera HTTP la cual indica al navegador que la imagen que estamos generando es .PNG
header('Content-type: image/png');

//genera un png dinámico
imagepng($im);
//destruye la imagen del servidor
imagedestroy($im);
?>

procesa.php
Código PHP:
<?php
// inicio sesiones
session_start();
if (
$_SESSION['mipass'] == $_POST['pass']){
echo 
"código/contraseña aceptado .. coincide ...";
} else {
echo 
"Pues el código/contraseña NO coincide ...";
}

// Y nos deshacemos de la sesión ...
unset($_SESSION);
session_destroy();
?>

tupagina.php
Código PHP:
<?
// inicio uso sesiones.
session_start();
// aquí metes tu función genera_password
include ("gen_codigo.php");
// llamas a la función para generar un password.
$pass=genera_password(6);
// lo dejamos en una variable de sesión para poderlo leer de forma segura en otro proceso.php ...
$_SESSION['mipass']=$pass;
?>
<html>
</head>
</head>
<body>
<!-- .. etc y tu formulario con -->
<form action="procesa.php" method="POST">

<!-- la imagen generada con nuestro password ... -->
<div align="center"><img border="1" src="gen_imagen.php"></div>

<input type="text" name="pass">
<input id="send" name="send" value="Verificar!" type="submit" />
</form>
</body>
</html>
Modificarias algo más?
  #14 (permalink)  
Antiguo 21/02/2008, 15:45
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Posicionar texto en captcha

Mejore el código para verificar el captcha, ya que es probable que alguien usara un formulario en blanco para prevenir el captcha.

http://www.forosdelweb.com/f18/faqs-...tml#post815501

Saludos y gracias por compartir tus mejoras.
  #15 (permalink)  
Antiguo 21/02/2008, 16:07
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Re: Posicionar texto en captcha

Cita:
Iniciado por GatorV Ver Mensaje
Mejore el código para verificar el captcha, ya que es probable que alguien usara un formulario en blanco para prevenir el captcha.

http://www.forosdelweb.com/f18/faqs-...tml#post815501

Saludos y gracias por compartir tus mejoras.
Una pregunta que siempre pienso pero que nunca la hago...

En todos mis hojas .php escribo muchos comentarios, comentando la jugada (valga la redundancia) eso a la hora de procesar el archivo por el servidor no es importante, me refiero no lo tiene en cuenta en la velocidad de tratar los datos, o sí que influye que por ej. haya mas comentarios que lineas de codigo!

Influyen cada linea? incluso las lineas vacias? en la rapidez de los scripts PHP?

Entonces mejor tener una replica del todo el codigo en local comentado y subir al server el bueno sin comentarios? y sin espacios entre lineas?

Gracias
  #16 (permalink)  
Antiguo 21/02/2008, 16:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Posicionar texto en captcha

No influye prácticamente en nada en la rapidez, a lo mejor puede influir al tiempo de parsearlo, pero como guarda una copia en memoria el parser pues no influiría después.

Lo que sí es que es buena practica documentar y poner comentarios, así te ayudas a ti mismo a la hora de leer códigos pasados.

Si te interesa optimizar tu código te recomiendo usar algún acelerador como Zend Encoder y compilar tus archivos PHP a código binario. Con eso evitas que el parser se active y PHP solo ejecutaría el script directamente.

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:40.