Simplificar y generar código капча PHP

Сер Parece extenso pero es necesario параграф llegar а-ля идея.

Капча Estoy desarrollando una imagen эра идей una de mis капча ejemplar una imagen подобная al капча de texto de google.

introducir la descripción de la imagen aquí

Нет он logrado crear el mismo estilo pero он алгоритм капчи generado una imagen подобный y creo que más исходный параграф ООН sistema propio.

introducir la descripción de la imagen aquí

Форма El texto de la imagen la genero de esta:

imagettftext($image,25,mt_rand(-40,30),10,30,$black,"resources/fonts/font.ttf",$first); //tamaño de la fuente se realiza en la primera numeración(25)
imagettftext($image,25,mt_rand(-40,30),30,30,$black,"resources/fonts/font1.ttf",$second); //giro de la fuente se realiza en la segunda y tercera numeración (-40,30)
imagettftext($image,25,mt_rand(-40,30),50,30,$black,"resources/fonts/font2.ttf",$third); // Espacio la cuarta, alto la quinta (50,30)
imagettftext($image,25,mt_rand(-40,30),70,30,$black,"resources/fonts/font3.ttf",$fourth); // se puede cambiar varios modelo de fuente

Para un código más ordenado y optimizado trate de implementar un array pero la imagen никакой груз.

$fonts = array(
    'font'  => array('spacing' => -3, 'minSize' => 27, 'maxSize' => 30, 'font' => 'resources/fonts/font.ttf'),
    'font1'  => array('spacing' =>-1.5,'minSize' => 28, 'maxSize' => 31, 'font' => 'resources/fonts/font1.ttf'),
    'font2' => array('spacing' => -2, 'minSize' => 24, 'maxSize' => 30, 'font' => 'resources/fonts/font2.ttf'),
    'font3'  => array('spacing' => -2, 'minSize' => 30, 'maxSize' => 38, 'font' => 'resources/fonts/font3.ttf'),
    'font4' => array('spacing' => -2, 'minSize' => 24, 'maxSize' => 34, 'font' => 'resources/fonts/font4.ttf'),
    'font5'     => array('spacing' => -2, 'minSize' => 28, 'maxSize' => 32, 'font' => 'resources/fonts/font5.ttf'),
    'font6' => array('spacing' =>-1.5,'minSize' => 28, 'maxSize' => 32, 'font' => 'resources/fonts/font6.ttf'),
    'font7'    => array('spacing' => -2, 'minSize' => 28, 'maxSize' => 34, 'font' => 'resources/fonts/font7.ttf'),
    'font8' => array('spacing' => -1, 'minSize' => 20, 'maxSize' => 28, 'font' => 'resources/fonts/font8.ttf'),
  );

El окрашивают de la fuente, ООН окрашивает diferente por cada actualización de la página:

$black = imagecolorallocate($image,rand(78,181),rand(163,35),rand(36,7));

El problema de este parámetro es conseguir el color удовольствие ми подставляет массив ООН sería mucho mejor pero se меня предшествующий presentó el mismo problema.

$black = array(
  array(17,70,121),
  array(12,133,25),
  array(114,26,7),
  array(38,44,10),
  array(16,113,52),
  array(123,29,26)
);   

El окрашивают de fondo de la imagen es blanco

$white = imagecolorallocate($image,255,255,255);

Никакая se СИ es возможная crear ООН не окрашивает de fondo прозрачным al añadir la variación de un rgba.

rgba(82, 56, 76, 0.15);

Форма De esta:

imagecolorallocate($image,82, 56, 76, 0.15);

никакой imprime la imagen.

Analizado Лос diferentes опечатки de капча en la web он капча observado en algunos надел el texto de la imagen es personalizado, esto se debe librerías .txt personalizadas надел el archivo .txt tiene diferentes texto personalizados utilizados Комо капча texto de la imagen.

diferencia de una imagen aleatoria:

$source = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

Sería útil poder reemplazar ООН texto aleatorio ООН texto personalizado mediante librerías .txt

Ми código капча en el diseño фактический captcha.php.

 (25)
imagettftext($image,25,mt_rand(-40,30),30,30,$black,"resources/fonts/AntykwaBold.ttf",$second); //giro de la fuente se realiza en la segunda y tercera numeración -> (-40,30)
imagettftext($image,25,mt_rand(-40,30),50,30,$black,"resources/fonts/Ding-DongDaddyO.ttf",$third); // Espacio la cuarta, alto la quinta -> (50,30)
imagettftext($image,25,mt_rand(-40,30),70,30,$black,"resources/fonts/Duality.ttf",$fourth); // se puede cambiar varios modelo de fuente

// Para añadir más caracters a la imagen se debe multiplicar estos parametros al caracters deseado
/*
imagettftext($image,25,mt_rand(-40,30),70,30,$black,"resources/fonts/Duality.ttf",$fourth);
*/

header("content-type:image/png");
imagepng($image);
?>
17
задан 29.12.2016, 02:24
1 ответ

На основании этого комментария

результат, который у него хотел быть, - сходный с текстом captcha Google, но больше того состоит в том, чтобы мочь объединять array в систему captcha использовать array цвета и array шрифта captcha как опциональное замечание мочь использовать текст, настроенный в изображении captcha через файл .txt

  • Чтобы создавать изображение используя один array для цветов, другого array для шрифтов и получать слово файла .txt, ты можешь делать следующее:

    Я храню в архиве captcha.php

    <?php
    session_start();
    
    $source = file('palabras.txt'); // Archivo con palabras
    $word = trim($source[rand(0, count($source) - 1)]); // Obtenemos una palabra
    $charsLength = strlen($word); // Cantidad de letras de la palabra
    $marginLeftRight = 10; // Margen izq derecho
    $marginTopBottom = 10; // Margen sup inf
    $fonts = array( // Arreglo de fuentes
        array('spacing' =>   -3, 'minSize' => 27, 'maxSize' => 30, 'font' => 'fonts/Quixley.ttf'),
        array('spacing' => -1.5, 'minSize' => 28, 'maxSize' => 31, 'font' => 'fonts/AntykwaBold.ttf'),
        array('spacing' =>   -2, 'minSize' => 24, 'maxSize' => 30, 'font' => 'fonts/Ding-DongDaddyO.ttf'),
        array('spacing' =>   -2, 'minSize' => 28, 'maxSize' => 30, 'font' => 'fonts/Duality.ttf')
    );
    
    $rgbs = array( // Arreglo de colores
      array(17,70,121),
      array(12,133,25),
      array(114,26,7),
      array(38,44,10),
      array(16,113,52),
      array(123,29,26)
    );
    
    // Generamos la palabra
    $_SESSION['captcha_secure'] = '';
    $chars = array();
    $imageWidth = 0;
    $imageHeight = 0;
    for ($i = 0; $i < $charsLength; $i++) {
    
        //
        $font = $fonts[mt_rand(0, count($fonts) - 1)];
        $char = array(
            'char'     => $word[$i],
            'font'     => $font['font'],
            'spacing'  => $font['spacing'],
            'size'     => rand($font['minSize'], $font['maxSize']),
            'angle'    => rand(-20, 20)
        );
        $coords = imagettfbbox ($char['size'], $char['angle'], $char['font'] , $char['char']);
        $imageWidth += ($coords[2] - $char['spacing']); // Sumamos el ancho del char actual
        $imageHeight = max($imageHeight, $char['size']);
    
        $_SESSION['captcha_secure'] .= $char['char']; // Concatenamos el char
        $chars[] = $char; // Guardamos la config del char
    }
    $imageWidth += $marginLeftRight * 2; // Sumamos el margen configurado
    $imageHeight += $marginTopBottom * 2; // Sumamos el margen configurado
    
    // Creamos la imagen
    $image = imagecreatetruecolor($imageWidth, $imageHeight); //Ancho y alto de la imagen
    
    // Fondo
    $white = imagecolorallocate($image, 255, 255, 255); // Color de fondo de la imagen
    imagecolortransparent($image, $white); // Transpartente
    imagefill($image, 0, 0, $white);
    
    // Color palabra
    list($r, $g, $b) = $rgbs[mt_rand(0, count($rgbs) - 1)];
    $wordColor = imagecolorallocate($image, $r, $g, $b);
    
    // Palabra
    $x = $marginLeftRight;
    $y = ($imageHeight / 2) + $marginTopBottom;
    foreach ($chars as $char) {
    
        // Color del char
        $coords = imagettftext($image, $char['size'], $char['angle'], $x, $y, $wordColor, $char['font'], $char['char']);
    
        $x += $coords[2] - $x - $char['spacing'];
    }
    
    header("content-type:image/png");
    imagepng($image);
    

    Я храню в архиве palabras.txt (без строк в мишени)

     globo
     chapuza
     varar
     poisa
     follar
     gozar
     cochina
     barbado
    

    Я храню в архиве index.php

    <div style="background: #ccc; display: inline-block;">
       <img src="captcha.php" />
    </div>
    

    Результаты:

  • Чтобы делать изображение, сходное с изображением Google

    Я рекомендую тебе читать расследуй на книжном магазине Imagen Magick. Эта статья может давать тебе пару идей.

    Здесь один snippet подобно примеру:

    <?php
    
    /* Creamos un objeto Imagick */
    $image = new Imagick();
    
    /* Creamos un objeto ImagickPixel para el fondo */
    $bg = new ImagickPixel();
    $bg->setColor('white'); // Blanco
    
    /* Creamos un ImagickDraw para configurar la fuente, tamaño, color y posición */
    $draw = new ImagickDraw();
    $draw->setFont('fonts/Duality.ttf');
    $draw->setFontSize( 50 );
    $draw->setFillColor("navy");
    $draw->setGravity(Imagick::GRAVITY_CENTER);
    $fontWidth = 
    
    /* Texto */
    $string = 'gozar';
    
    /* Creamos la imagen */
    $image->newImage(120, 60, $bg); 
    
    /* Escribimos el texto en la imagen */
    $image->annotateImage($draw, 0, 0, 0, $string);
    
    /* Arremolinamos la imagen (swirl) */
    $image->swirlImage(45);
    
    /* Agregamos el dibujo. */
    $image->drawImage($draw);
    
    /* Seteamos el formato */
    $image->setImageFormat('png');
    
    
    header( "Content-Type: image/{$image->getImageFormat()}" );
    echo $image->getImageBlob();
    

    Результат:

9
ответ дан 03.12.2019, 18:24
  • 1
    Привет @MarcosGallardo спасибо за ответ, я протестировал дружелюбный пример функционируй, но однако существует pequeñ или ошибка освежила страницу, чтобы видеть тип impresió n изображения в нескольких разах, которые освежала бы pá gina принимая во внимание nú морской окунь раз, которые освежала бы pá gina 3-> 4-> 12 в одной из них изображение не печатает остается одинокой белая рама с краем, но не печатает изображение текста captcha, освежив nú уже упомянутый морской окунь раз. Pensé что ошибка была каким-то шрифтом, который не был в папке fonts но всех шрифтах está n в папке. –  02.01.2017, 04:08
  • 2
    Друг на цвете шрифта, поскольку я получаю единственный цвет шрифта вместо различного цвета из-за каждой буквы. –  02.01.2017, 04:21
  • 3
    Привет @MarcosGallardo с новостью actualizació n получения слова с файла .txt уже он не показывает ошибку impresió n изображения старого có говорит pequeñ или деталь - это во время обновления pá gina изображение текста обычно печатает seguidamente тот же текст, обновив. На создании текста, сходного с Google в тексте, изогнутый и Ondulació n текста вертикальные и горизонтальные encontré этот có я говорю documentació n кода это что-то сходное с темой, что мы относимся в моем вопросе http://ideone.com/ustrYF к –  03.01.2017, 04:49
  • 4
    Ты можешь бросать ú ltimo беглый взгляд в documentació n перед тем, как выбирать вопрос, quizá s documentació n смогите стоить чем-то для того, чтобы работать в теме má s основательно :) Привет. –  03.01.2017, 05:02
  • 5
    @J.Doe, я обновил мой вопрос. Я существую añ adido высокое вычисление automá костариканский и исправленное место между буквами. Относительно вероятности того, что появится то же слово, возможно исправлять, если ты помещаешь 1000 (тысяч или более) слов в .txt. Относительно snippet ты можешь печатать твой собственный ответ используя этот có я говорю. –  03.01.2017, 15:36

Х. Доу, ты попробовал использовать imagefill() и наполнять это распределенным цветом imagecolorallocatealpha() у которого может быть стоимость между 0 и 127а именно, 0 показывает полностью матовый в то время как 127 показывает полностью прозрачно.

Заметь: imagecolorallocatealpha () он ведет себя с идентичной формы до imagecolorallocate () с прибавлением параметра прозрачности alpha.

Могло бы оставаться нечто похожее:

$white = imagecolorallocatealpha($image,255,255,255,80); //Fondo imagen.
imagefill($image,0,0,$white);//Rellenar.

Исходный код SO:

Учебник imagecolorallocatealpha():

Учебник imagefill():

2
ответ дан 24.11.2019, 11:54

если ты используешь imagecolortransparent ()?

здесь я оставляю тебе пример:

<?php
// Crear una imagen de 55x30
$im = imagecreatetruecolor(55, 30);
$rojo = imagecolorallocate($im, 255, 0, 0);
$negro = imagecolorallocate($im, 0, 0, 0);

// Hacer el fondo transparente
imagecolortransparent($im, $negro);

// Dibujar un rectángulo rojo
imagefilledrectangle($im, 4, 4, 50, 25, $rojo);

// Guardar la imagen
imagepng($im, './imagecolortransparent.png');
imagedestroy($im);
?>
1
ответ дан 03.12.2019, 18:24