Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: CAPTCHA на PHP  (Прочитано 17284 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« : 31-03-2010 18:13 » 

Не нашёл форума по PHP, поэтому пишу здесь... У меня есть скрипт каптчи, я его изменил под свои нужды, но у скрипта есть маленькая проблема: изображение выдаёт с большой потерей качества. Нигде переменной отвечающей за качество не нашёл. Может кто знает как сделать качество картинки на 100%...
Код:
<?php
session_start
();
// выбираем случайную картинку
$im=ImageCreateFromJpeg(round(mt_rand(1,3)).".jpg");
// генерируем цвет надписи
$color=ImageColorAllocate($im,mt_rand(255,255),mt_rand(255,255),mt_rand(255,255));
// создаём изображение проверочного кода
ImageTtfText($im30mt_rand(0,0), 1527$color"beast_impact.ttf",  $_SESSION[&#39;uid&#39;]);
// имя картинки (переменная) , размер шрифта, углы наклона, отступ слева, отступ сверху, цвет, шрифт, текст(сам код)
Header("Content-type: image/jpg");
ImageJpeg($im);
ImageDestroy($im);
?>

« Последнее редактирование: 31-03-2010 18:15 от RXL » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 31-03-2010 18:17 » 

Барин, почитай о форматах сжатия графики.

Используй imagegif(), либо imagepng().
О imagejpeg почитай в мануале:

Цитата
imagejpeg

(PHP 4, PHP 5)

imagejpeg — Output image to browser or file

Описание

bool imagejpeg ( resource $image [, string $filename [, int $quality ]] )

imagejpeg() creates a JPEG file from the given image .

Список параметров

image
    An image resource, returned by one of the image creation functions, such as imagecreatetruecolor().

filename
    The path to save the file to. If not set or NULL, the raw image stream will be outputted directly.
    To skip this argument in order to provide the quality parameter, use NULL.

quality
    quality is optional, and ranges from 0 (worst quality, smaller file) to 100 (best quality, biggest file). The default is the default IJG quality value (about 75).

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
« Последнее редактирование: 31-03-2010 18:21 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 10-04-2010 18:12 » 

Можете дать ссылку на нормальный скрипт капчи, с кнопкой обновления изображения. Сам хотел сделать, но не понял как Улыбаюсь Подучил AJAX, понял как делаются асинхронные запросы, но ответ от сервера научился принимать только в текстовом формате и формате xml. А вот как вернуть созданное изображение не знаю.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 11-04-2010 07:34 » 

Барин, AJAX никак не поможет. Загрузить и отобразить картинку, без сторонних плагинов типа Java и Flash, можно только загрузив ее через тег img или iframe/frame. Соответственно, просто смени URL тега img, в котором отображается CAPTCHA. Чтобы не мешали такие факторы, как одинаковое имя и кеширование, добавляй к имени параметр со случайным значением.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 11-04-2010 09:46 » 

Понятно, сегодня попробую, потом отпишусь.
Записан
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 05-09-2011 15:42 » 

Спустя кучу времени вернулся в данную тему. С каптче всё хорошо. Но только на локальном компьютере. А вот  на серваке появляется только фон, а цифр нет. По-видимому не срабатывает функция imagettftext, которая отвечает за наложение текста. Для её работы нужны GD и Free Type библиотеки. Проверял, на серваке - они установлены и включены. В чём может быть проблема?
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 05-09-2011 15:48 » new

обрати внимание

imagettftext

что делает?

изображение - шрифт  - текст

Изображение должно получиться
Текст - наверное есть
Шрифт? Путь к шрифту?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 05-09-2011 15:50 » 

А протрасировать? В лог кидать сообшения, по прохождению каждого этапа, заодно записывать полученную картинку на диск. Тогда можно уже говорить, кто именно виноват.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 05-09-2011 15:52 » 

Именно! Внимательно читай документацию и (почти) все будет понятно.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 05-09-2011 15:53 » 

я бы посоветовал поизучать аналоги
http://www.google.com/recaptcha
Правда рекапчу уже народ ломает вовсююю...
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 07-09-2011 14:50 » 

Мне порекомендовали написать ./ перед названием шрифта, то есть так:
Код:
ImageTtfText($im, 30, mt_rand(0,0), 15, 27, $color, "./beast_impact.ttf",  $chislo);
Теперь всё работает.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 08-09-2011 05:47 » 

Я же сказал, что надо читать документацию...

http://ru2.php.net/manual/en/function.imagettftext.php
Цитата
   The path to the TrueType font you wish to use.

    Depending on which version of the GD library PHP is using, when fontfile does not begin with a leading / then .ttf will be appended to the filename and the library will attempt to search for that filename along a library-defined font path.

    When using versions of the GD library lower than 2.0.18, a space character, rather than a semicolon, was used as the 'path separator' for different font files. Unintentional use of this feature will result in the warning message: Warning: Could not find/open font. For these affected versions, the only solution is moving the font to a path which does not contain spaces.

    In many cases where a font resides in the same directory as the script using it the following trick will alleviate any include problems.
Код:
    <?php
    
// Set the enviroment variable for GD
    
putenv(&#39;GDFONTPATH=&#39; . realpath(&#39;.&#39;));

    // Name the font to be used (note the lack of the .ttf extension)
    
$font = &#39;SomeFont&#39;;
    
?>


Полезно еще почитать доку к библиотеке GD.


И не пиши регистр идентификаторов как тебе вздумается! Да, сейчас PHP не чувствителен к регистру идентификаторов и "ImageTtfText" и "imagettftext" - это одно и тоже, но в будущем поведение PHP может измениться.
« Последнее редактирование: 08-09-2011 05:49 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines