Script captcha generator in PHP does not generate the image

Asked

Viewed 485 times

2

I am trying to run the site script below, which generates captcha, but the image is never generated. Can anyone give me a light of what I might be doing? I’m running the script via Docker.

Page: https://www.devmedia.com.br/captcha-simples-com-php/17444

index php.

<!--
No campo src da tag img abaixo enviaremos 4 parametros via GET
l = largura da imagem
a = altura da imagem
tf = tamanho fonte das letras
ql = quantidade de letras do captcha
-->
<img src="captcha.php?l=150&a=50&tf=20&ql=5">
<!--
O texto digitado no campo abaixo sera enviado via POST para
o arquivo validar.php que ira vereficar se o que voce digitou é igual
ao que foi gravado na sessao pelo captcha.php
-->
<form action="validar.php" name="form" method="post">
   <input type="text" name="palavra"  />
   <input type="submit" value="Validar Captcha" />
</form>

captcha.php

<?php
   session_start(); // inicial a sessao
   header("Content-type: image/jpeg"); // define o tipo do arquivo

    function captcha($largura,$altura,$tamanho_fonte,$quantidade_letras){
        $imagem = imagecreate($largura,$altura); // define a largura e a altura da imagem
        $fonte = "arial.ttf"; //voce deve ter essa ou outra fonte de sua preferencia em sua pasta
        $preto  = imagecolorallocate($imagem,0,0,0); // define a cor preta
        $branco = imagecolorallocate($imagem,255,255,255); // define a cor branca

        // define a palavra conforme a quantidade de letras definidas no parametro $quantidade_letras
        $palavra = substr(str_shuffle("AaBbCcDdEeFfGgHhIiJjKkLlMmNnPpQqRrSsTtUuVvYyXxWwZz23456789"),0,($quantidade_letras)); 
        $_SESSION["palavra"] = $palavra; // atribui para a sessao a palavra gerada
        for($i = 1; $i <= $quantidade_letras; $i++){ 
        imagettftext($imagem,$tamanho_fonte,rand(-25,25),($tamanho_fonte*$i),($tamanho_fonte + 10),$branco,$fonte,substr($palavra,($i-1),1)); // atribui as letras a imagem
        }
        imagejpeg($imagem); // gera a imagem
        imagedestroy($imagem); // limpa a imagem da memoria
    }

    $largura = $_GET["l"]; // recebe a largura
    $altura = $_GET["a"]; // recebe a altura
    $tamanho_fonte = $_GET["tf"]; // recebe o tamanho da fonte
    $quantidade_letras = $_GET["ql"]; // recebe a quantidade de letras         
que o captcha terá
    captcha($largura,$altura,$tamanho_fonte,$quantidade_letras); //         
executa a funcao captcha passando os parametros recebidos
?>

validate.php

<?php
   session_start();
    if ($_POST["palavra"] == $_SESSION["palavra"]){
        echo "<h1>Voce Acertou</h1>";
    }else{
        echo "<h1>Voce nao acertou!</h1>";
        echo "<a href='index.php'>Retornar</a>";
    }
?>

Error:

inserir a descrição da imagem aqui

  • What error appears in the PHP error log?

1 answer

2


Your code is correct, what is causing error is a very common problem in the function imagettftext(). The problem of attaching the font to the text on fontfile of function.

According to the manual:

Depending on which version of the GD library PHP is using, when fontfile does not start with a Leading / then . ttf will be attached to the name of file and the library will try to search for that name along a source path defined by the library.

When I tried to use the same font as you, in the same directory like this:

 $fonte = "arial.ttf";

The image came broken. Just comment on this line to see the error:

 // header("Content-type: image/jpeg");

Error:

imagettftext(): Invalid font filename

When I switched to absolute paths:

 $fonte = "C:/Windows/fonts/arial.ttf";
 // ou
 $fonte = "C:/wampp/www/app/fontes/arial.ttf";
 // ou
 $fonte = "C:/xampp/htdocs/app/fontes/arial.ttf";

The result was:

inserir a descrição da imagem aqui

Another option that the manual advises, if you are using the image in the same directory is to do this:

putenv('GDFONTPATH=' . realpath('.'));
$font = "Arial"; 

It didn’t work for me. I’d rather do it:

$fonte = getcwd()."/arial.ttf"; // isso funciona

Like the getcwd() there will be no problems when the script is for production.

  • 1

    I was able to correct the code as you instructed me here, thank you very much!

  • @danielfr3 quiet! I advise you to use the getcwd(), because when you put into production, there will be no problems.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.