Генерація зображення

Автор запропонував наступний алгоритм: складне зображення на картинці
формується за допомогою заздалегідь підготовлених підкладок. Після чого на підкладки
виводиться текст, випадковим шрифтом, випадкового розмір і, природно, випадкового
змісту.

Основний недолік такого алгоритму полягає в тому, що існуючу
"Підкладку" можна швидко обчислити. А після цього відняти із зображення, яке
необхідно розпізнати і таким чином отримати картинку з чистим текстом. А для
розпізнання такого тексту вже сьогодні існує маса програм.

Наше завдання – зробити абсолютно випадкову підкладку, з текстом, який не те
що розпізнати складно, його прочитати важко.

Я б запропонував наступний алгоритм:


  1. Створюємо підкладку (для цього можна використовувати алгоритм побудови
    фракталів)
  2. Додаємо перешкоди – кілька випадкових ліній, кольору основного тексту.
  3. Виводимо основний текст
  4. Найцікавіше – збільшуємо зображення в нерівне кількість разів –
    наприклад, в 1.7, в 1.6
  5. Зменшуємо зображення до оригінальних розмірів

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

Якщо вам здається, що малювати фрактал занадто складно, то можна намалювати
просту сітку.

Принцип роботи механізму


При заході користувача на сторінку з формою, ми створюємо сесію і записуємо
в зареєстровану змінну випадковий код:

session_start();
session_register("secret_number");

if (intval($_SESSION["secret_number"])<1000) {
srand(doubleval(microtime()));
$_SESSION["secret_number"]=rand(1000,9999);
}


Після того як випадковий текст згенерований, необхідно вивести форму:

<form action="index.php" method="post">
Ваш E-Mail: <br>
<input type="text" name="email" value=""> <br>
<br>
Введіть код, який ви бачите на зображенні: <br>
<input type="text" name="secretcode" value=""> <br>
<Img src = "http://www.ishodniki.ru/code.php? <? = Doubleval (microtime ());?>"
width=101 height=26 vspace=5>
<br><br>
<input type="submit">
</form>

Скрипт, що обробляє дані, відправлені за допомогою форми, повинен працювати
приблизно наступним чином:

session_start();
session_register("secret_number");

if ($_SERVER["REQUEST_METHOD"]=="POST") {

$error=0;
if ($ _POST ["secretcode "]!=$_ SESSION [" secret_number "] | |
intval($_POST["secretcode"])==0) $error=1;

if ($error==0) {
$_SESSION["secret_number"]=rand(1000,9999);

/ / Виконуємо необхідні дії з даними
// ..
print "Hello". htmlspecialchars (StripSlashes ($ _POST ["email "]));
exit;
}

if ($error==1)
print "<font color=red> Число з картинки введено невірно </ font>";
}

/ / Виводимо форму повторно
// …


<?
/ / Реєструємо змінну
session_start();
session_register("secret_number");

function mt() {
list($usec, $sec) = explode(” “, microtime());
return (float) $sec + ((float) $usec * 100000);
}

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

/ / Створюємо зображення
$im=imagecreate(101, 26);

/ / Виділяємо колір фону (білий)
$w=imagecolorallocate($im, 255, 255, 255);

/ / Виділяємо колір для фону (світло-сірий)
$g1=imagecolorallocate($im, 192, 192, 192);

/ / Виділяємо колір для більш темних перешкод (темно-сірий)
$g2=imagecolorallocate($im, 64,64,64);

/ / Виділяємо чотири випадкові темних кольору для символів
$ Cl1 = imagecolorallocate ($ im, rand (0,128), rand (0,128), rand (0,128));
$ Cl2 = imagecolorallocate ($ im, rand (0,128), rand (0,128), rand (0,128));
$ Cl3 = imagecolorallocate ($ im, rand (0,128), rand (0,128), rand (0,128));
$ Cl4 = imagecolorallocate ($ im, rand (0,128), rand (0,128), rand (0,128));

/ / Малюємо сітку
for ($i=0;$i<=100;$i+=5) imageline($im,$i,0,$i,25,$g1);
for ($i=0;$i<=25;$i+=5) imageline($im,0,$i,100,$i,$g1);

/ / Виводимо кожну цифру окремо, трохи зміщуючи випадковим чином
imagestring($im, 5, 0+rand(0,10), 5+rand(-5,5),
substr($_SESSION["secret_number"],0,1), $cl1);
imagestring($im, 5, 25+rand(-10,10), 5+rand(-5,5),
substr($_SESSION["secret_number"],1,1), $cl2);
imagestring($im, 5, 50+rand(-10,10), 5+rand(-5,5),
substr($_SESSION["secret_number"],2,1), $cl3);
imagestring($im, 5, 75+rand(-10,10), 5+rand(-5,5),
substr($_SESSION["secret_number"],3,1), $cl4);

/ / Виводимо пару випадкових ліній тісного кольору, прямо поверх символів.
/ / Для збільшення кількості ліній можна збільшити,
/ / Змінивши число виділене червоним кольором
for ($i=0;$i<8;$i++)
imageline ($ im, rand (0,100), rand (0,25), rand (0,100), rand (0,25), $ g2);

/ / Коефіцієнт збільшення / зменшення картинки
$k=1.7;

/ / Створюємо нове зображення, збільшеного розміру
$im1=imagecreatetruecolor(101*$k,26*$k);

/ / Копіюємо зображення зі зміною розмірів у більшу сторону
imagecopyresized ($ im1, $ im, 0, 0, 0, 0, 101 * $ k, 26 * $ k, 101, 26);

/ / Створюємо нове зображення, нормального розміру
$im2=imagecreatetruecolor(101,26);

/ / Копіюємо зображення зі зміною розмірів в меншу сторону
imagecopyresampled ($ im2, $ im1, 0, 0, 0, 0, 101, 26, 101 * $ k, 26 * $ k);

/ / Генеруємо зображення
imagepng($im2);

/ / Звільняємо пам'ять
imagedestroy($im2);
imagedestroy($im1);
imagedestroy($im);
?>


Ніби все. Якщо щось, залишайте коментарі.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*