Создание картинки со случайным кодом

Silent

Новичок
Еще один примитивный алгоритм деформирования картинки:
PHP:
    $pi = 3.1415926;
    $angle = 25*$pi/180;
    for ($i=0; $i<99; $i++) {
        for ($j=0; $j<99; $j++) {
            $x = ($i-50)*cos($angle)-($j-50)*sin($angle) + 50;
            $y = ($i-50)*sin($angle)+($j-50)*cos($angle) + 50;
            if ($x<0||$x>99||$y<0||$y>99) { next }
            $color = $im->getPixel($x,$y);
            $im_new->setPixel($i,$j,$color);
        }
    }
    
    $im->copy($im_new,0,0,0,0,100,100);
    $im_new->filledRectangle(0,0,99,99,$white);

    for ($i=0; $i<99; $i++) {
        for ($j=0; $j<99; $j++) {
            $x = $i + 0.7*cos($j*2*$pi/12);
            $y = $j + 1.1*cos($i*2*$pi/6);
            if ($x<0||$x>99||$y<0||$y>99) { next }
            $color = $im->getPixel($x,$y);
            $im_new->setPixel($i,$j,$color);
        }
    }
код написан на Перле, но идея должна быть понятна. Результат - http://risearch.org/test_gd_distort.png
Там конечно еще нужно с коэффициентми поиграться и добавить поворот отдельных символов на произвольный угол.
 

alexhemp

Новичок
SiMM
fixxxer

Извиняюсь, поторопился... давно HTTP запросы ручками не делал.

Но идея-то ясна, что клиентский запрос формировать, что серверный ответ - все одинаково не сложно.

А насчет нового поколения - это вы зря... Я скорее "среднее". Почитайте мои вопросы, на них тут ответа никто дать не может.
 

HeavyNatas

Новичок
А если распознавать не число а количество каких нибудь фигур или их отсутствие.
То есть мы имеем картинку чуть побольшена которой с одной стороны изображено n-ое количество некоторых фигур, а в другой части на картинке просьба ввести количество этих фигур.
Конечно 100 фигурок не нарисуешь на маленькой картинке, но 0-4 квадрата, треугольника и круга нарисовать вполне можно.
Еще есть один вариант вводить число Джаваскриптом при помощи вирт. клавиатуры.

Хотя ИМХО эта вся закрученная система будет несколько напрягать пользователя. Может попробовать написать поумнее скрипт регистрации, который не будет втупую регать всх кого ни попадя ?
 

Silent

Новичок
Определить число фигур автоматически должно быть гораздо проще, чем распознать деформированные цифры.
 

HeavyNatas

Новичок
Originally posted by Silent
Определить число фигур автоматически должно быть гораздо проще, чем распознать деформированные цифры.
Согласен.
Но если еще условие (что надо ввести) написано на другой стороне картинке, то нужно распознать еще и его ))
 

scazy

Guest
попробуй очень понравится


//-основной код
$inputv = array(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z);
for($vv=1;$vv<=8;$vv++){
$rand_keysv = array_rand($inputv, 2);
$ver.=$inputv[$rand_keysv[1]];
}
<img src=../sys/imdig.php?sec=$ver>

//-------------------------
//--код графического файла
<?
header ("Content-type: image/png");
$im = @imagecreate (220, 50);
$background_color = imagecolorallocate ($im, 255, 255, 255);
$SecStr=str_split($sec);
$x=10;
$a=10;
$s=20;
$y=30;
foreach($SecStr as $dig){
$k1=rand(0,200);
$k2=rand(0,200);
$k3=rand(0,200);
$text_color = imagecolorallocate ($im, $k1, $k2, $k3);
imagettftext($im,$s,$a,$x, $y, $text_color, "npr.ttf", "$dig");// любой файл шрифта
$x+=25;
if($i==1){
$y=25;
$a=10;
$i=2;
$s=20;
}elseif($i==2){
$y=30;
$i=0;
$a=0;
$s=18;
}else{
$y=35;
$i=1;
$a=-10;
$s=28;
}
}
imagepng ($im);
imagedestroy ($im);
 

jonjonson

Guest
scazy, а ты сам пытался запустить кусок кода, который запостил?
 

Crys

Двинутый новичок
Я лично в скрипте проверяю, записан ли "код" в сессию, если нет - устанавливаем её...

После чего, там, где надо - показываем эту картинку...
После того, как код на картинке введен верно и нужное действие свершилось - пишем в сессию время последнего действия и проверяем в дальнешем, не рано ли юзвер новое свершает... Т.к. сессию можно убить посредством закрытия/открытия сайта.... от обычных хулиганов-флудеров это не помогает... Но вот от флудеров-ботов, думаю спасет... :)

PHP:
<?php
$width=150;
$height=75;
session_start();
if (!@$_SESSION["antiflood_code"]){die;}
header("Content-type: image/jpeg");
$im=imagecreate($width,$height);
$col_r=rand(200,255);$col_g=rand(200,255);$col_b=rand(200,255);
$bgcolor=imagecolorallocate($im,$col_r,$col_g,$col_b);
$col_r=rand(0,150);$col_g=rand(0,150);$col_b=rand(0,150);
$color=imagecolorallocate($im,$col_r,$col_g,$col_b);
for ($i=0;$i<10;$i++){
imagearc($im,rand(0,200),rand(0,100),rand(0,100),rand(-100,100),0,0,$color);
}
for ($i=0;$i<10;$i++){
imageline($im,0,$i+rand(0,$height/2),$width,$i+rand(0,$width/2),$color);
}
$font=rand(15,25);
$x=rand(10,30);
$y=rand(30,50);
imagettftext ($im,$font,rand(-5,5),$x,$y,$color,"../font/".rand(1,3).".ttf",$_SESSION["antiflood_code"]); // "../font/'.rand(1,3).'.ttf" означает, что в папке ../font у меня хранятся файлы шрифтов 1.ttf....3.ttf которые на картинке показываются "рэндомно"... Можно и больше... Просто не нашел ещё "красивых" шрифтов...
imageJpeg($im);
?>
В коде куча rand(N,M) встречается... ХЗ... Эффект "случайности" встраивал... Но вроде бы и так просто и эффектно выглядит...
Овальчики и линии цвета шрифта+разный размер шрифта+можно использовать разные шрифты+наклоны шрифтов...
 

pforest

Guest
а если разрезать?

Слушайте, а если после создания картинки с цифрами ее разрезать вертикально на 3-4 части?
это усложнит сканирование ?
 

x1024

Guest
Когда я писал такой модуль, я воспользовался:
1) набором jpg в которых были цифры из тетради моей сестры (5 лет) где-то по 8 штук на цифру
2) цвет цифр В СРЕДНЕМ был всего на 10-25 яркости по RGB выше фона
(Разница в яркости это ИМХО смерть для программ распознавания)
3) фон состоял из рандомных точек (опять таки набор jpg, чтобы каждый раз не считать)
4) поверх цифр я накладывал 10-20 рандомных линий со средней яркостью как у цифр

Трудности в распознавании были не то что у компьютера, но порой и у пользователей :)

Так что шрифты made by 5 летний ребенок - рулез.
 

tRim

Guest
На самом деле не стоит очень расчитывать на HTTP_REFERER, потому что он действительно подменяется очень легко. Программка есть Access Diver.
Да и вообще написать безопасный скрипт совсем нелегко (для новичков).
Поэтому уж при авторизации/регистрации вещь с картинкой очень даже полезна!!!
 

SET rus

Guest
Можно попробовать использовать <input type="hidden" name="" value="">, где в value хранится хитрый код числа/фразы на картинке. Натравить на него 25 раз хеш-функцию. А в следующий раз - 6. И проверять соответственно. Это, конечно, утрированно, но никаких сессий, ибо нефиг...

А картинки - это воля извращенного ума создателя. рандрoм можно навтыкать и хоть занавтыкаться, благо imagettftext() - функция всеобъемлющая...
 

SiMM

Новичок
Автор оригинала: SET rus
Можно попробовать использовать <input type="hidden" name="" value="">, где в value хранится хитрый код числа/фразы на картинке.
И какой в этом смысл? Провожу аналогию - уходя из дому ты кладёшь ключ под коврик, а не двери вывешиваешь надпись "ключ под ковром", а чтобы никто об этом не узнал - сверху прикладываешь несколько белых листов бумаги (каждый раз случайное количество, чтобы враг не догадался). Как ты думаешь, долго будут ключ искать?
 

Jack VL

Guest
Вот еще

Лично я делаю так:
1. Случайно выбираю 1 из 8 картинок с прикольным переливающемся колером (весят где-то 900 байт)

2. На ней рисую цифири разным шрифтрм и вывожу.

Только надо предварительно хидером запретить кэширование ...причем всеми 6 вариантами...об этом почему-то никто не сказал...
 

Ms

Новичок
Встал перед аналогичной проблеммой всего 1 месяц назад.

Решил следующим образом:
http://www.msfit.ru/i/confirm/125+20-15.png

Тут мы видим ок.50 полос, начерченных в разном порядке+текст, который не сливается с полосами+под наклоном.

Пока никто не взломал :)))
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
>Пока никто не взломал
да и "неуловимого" Джо - тоже никто не поймал ;-)
 

Yurik

/dev/null
зацените мой вариант:
Код:
GET /bred/image.php HTTP/1.1
Host: www.chdez.com.ru

--- server response:

HTTP/1.1 200 OK
Date: Sun, 06 Feb 2005 18:56:58 GMT
Server: Apache
X-Powered-By: PHP/4.3.10
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

0
 
Сверху