
<?php
echo '<body bgcolor="#aaa"><pre>';
captcha();
echo '</pre>';
function captcha() {
$captcha_random = captcha_random_string();
$captcha_glyphs = captcha_alpha_numeric();
$captcha_inject = '01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%&?@';
for ($i = 0; $i < 7; $i++) {
for ($c = 0; $c < strlen($captcha_random); $c++) {
$char = $captcha_random[$c];
$char = $captcha_glyphs[$char];
$char = $char[$i];
$fill = array();
for ($n = 0; $n < strlen($char); $n++) {
$x = $char[$n];
$r = $captcha_inject[rand(0, strlen($captcha_inject) - 1)];
$hi_r = 16+rand()%50;
$hi_g = 16+rand()%50;
$hi_b = 16+rand()%50;
$lo_r = 200+rand()%50;
$lo_g = 200+rand()%50;
$lo_b = 200+rand()%50;
$hi = sprintf("%x%x%x", $hi_r, $hi_g, $hi_b);
$lo = sprintf("%x%x%x", $lo_r, $lo_g, $lo_b);
if ($x == '#') {
$x = "<font color=$hi><b>$r</b></font>";
}
else {
$x = "<font color=$lo><b>$r</b></font>";
}
$fill[] = $x;
}
echo implode($fill);
}
echo "\n";
}
}
function captcha_random_string($length = 10) {
$alphanumeric = '1457ACEFHIJKLMNPRTUVWXYZ';
$randomstring = array();
for ($i = $length; $i > 0; $i--) {
$n = rand(0, 23);
$randomstring[] = $alphanumeric[$n];
}
return implode($randomstring);
}
function captcha_alpha_numeric() {
$alphanumeric = array(
'1' => array(
" # ",
" ## ",
" # # ",
" # ",
" # ",
" # ",
" ##### ",
),
'4' => array(
"# ",
"# # ",
"# # ",
"# # ",
"####### ",
" # ",
" # ",
),
'5' => array(
"####### ",
"# ",
"# ",
"###### ",
" # ",
"# # ",
" ##### ",
),
'7' => array(
"####### ",
"# # ",
" # ",
" # ",
" # ",
" # ",
" # ",
),
'A' => array(
" # ",
" # # ",
" # # ",
"# # ",
"####### ",
"# # ",
"# # ",
),
'C' => array(
" ##### ",
"# # ",
"# ",
"# ",
"# ",
"# # ",
" ##### ",
),
'E' => array(
"####### ",
"# ",
"# ",
"##### ",
"# ",
"# ",
"####### ",
),
'F' => array(
"####### ",
"# ",
"# ",
"##### ",
"# ",
"# ",
"# ",
),
'H' => array(
"# # ",
"# # ",
"# # ",
"####### ",
"# # ",
"# # ",
"# # ",
),
'I' => array(
"### ",
" # ",
" # ",
" # ",
" # ",
" # ",
"### ",
),
'J' => array(
" # ",
" # ",
" # ",
" # ",
"# # ",
"# # ",
" ##### ",
),
'K' => array(
"# # ",
"# # ",
"# # ",
"### ",
"# # ",
"# # ",
"# # ",
),
'L' => array(
"# ",
"# ",
"# ",
"# ",
"# ",
"# ",
"####### ",
),
'M' => array(
"# # ",
"## ## ",
"# # # # ",
"# # # ",
"# # ",
"# # ",
"# # ",
),
'N' => array(
"# # ",
"## # ",
"# # # ",
"# # # ",
"# # # ",
"# ## ",
"# # ",
),
'P' => array(
"###### ",
"# # ",
"# # ",
"###### ",
"# ",
"# ",
"# ",
),
'R' => array(
"###### ",
"# # ",
"# # ",
"###### ",
"# # ",
"# # ",
"# # ",
),
'T' => array(
"####### ",
" # ",
" # ",
" # ",
" # ",
" # ",
" # ",
),
'U' => array(
"# # ",
"# # ",
"# # ",
"# # ",
"# # ",
"# # ",
" ##### ",
),
'V' => array(
"# # ",
"# # ",
"# # ",
"# # ",
" # # ",
" # # ",
" # ",
),
'W' => array(
"# # ",
"# # # ",
"# # # ",
"# # # ",
"# # # ",
"# # # ",
" ## ## ",
),
'X' => array(
"# # ",
" # # ",
" # # ",
" # ",
" # # ",
" # # ",
"# # ",
),
'Y' => array(
"# # ",
" # # ",
" # # ",
" # ",
" # ",
" # ",
" # ",
),
'Z' => array(
"####### ",
" # ",
" # ",
" # ",
" # ",
" # ",
"####### ",
),
);
return $alphanumeric;
}

парсер написать легко только потому что буквы тёмного цвета, слишком маленькая сумма R+G+B, но если буквально одну-две буквы пропускать и делать их под цвет фона, то парсер угадыватель капчи обосрётся и не разгадает ничего
дискасс
А если кластеризовать цвета букв?
И вообще, если под картинку будет писаться парсер то почему тогда не закрашивать прямоугольной буквы в цвет этой буквы и только потом вести дальнейшую разработку?
Думаю что капча должна содержать междустроковый текст.
Например одному и тому же заданию "найди зелёное" может соответствовать такие варианты теста:
. Фотографии различных дебилок все зелённого цвета, но одна из них Грета Тумберг
. Фотографии разных протестов на одной из которых одна женщина обливает красной жидкостью другую женщину
. Куча чёрнобелых фотографий одна из которых Есентуки, Полюстрово и т.д. . Чёрнобелые фотографии автомашин одна из которых советские Жигули(зелёные машины популярны только в СССР) . Чёрнобелые фотографии разных агрегатов одна из которых фрезерный или токарный станок(в СССР их красили в зелёный цвет)
Теже фотки станков могут быть в задании "найди красное" или "найди страшный предмет"
При этом если рядом со станком показана косоворотка то ответом на поиск красного становится она(ибо она красная сейчас)