Сообщений: 981
Тем: 77
Зарегистрирован: Oct 2011
imagecreatetruecolor() - создаёт новое изображение true color. озвращает идентификатор чёрно-белого изображения размером x_size на y_size. Собственно как можно сменить фон? При волновом искажении изображения, получаются черные края.
Сообщений: 120
Тем: 3
Зарегистрирован: Feb 2010
Репутация:
38
imagecolorallocate()
З.Ы. Капчу свою пишешь?
В kcaptcha сразу за imagecreatetruecolor() идет imagealphablending(), после этого при помощи imagecolorallocate() указывается цвет фона (белый) и цвет альфа слоя (черный) и поверх рисуется белый прямоугольник
PHP код: <?php
$img=imagecreatetruecolor($width, $height);
imagealphablending($img, true);
$white=imagecolorallocate($img, 255, 255, 255);
imagefilledrectangle($img, 0, 0, $width-1, $height-1, $white);
?>
Сообщений: 981
Тем: 77
Зарегистрирован: Oct 2011
01-16-2012, 02:07 PM
(Сообщение последний раз редактировалось: 01-17-2012, 12:36 PM Gambit_J.)
Да, капчу. Все сделал, 1 косяк остался вот. Спс.
Добавлено через 4 минуты
Хмм, принцип понятен, но что-то все так же осталось.
Я понял, вообщем прямоугольник тоже искажаться. Мне надо как-то игнорировать этот момент, ничего в голову не лезет. Или сделать обратное искажение...
P.S. вместео прямоугольника тогда уже легче сделать заливку фона:
imagefill ($img, 0, 0, 0xf9e3e7);
Добавлено через 22 часа 29 минут
Для ясности, вот что происходит:
Сообщений: 981
Тем: 77
Зарегистрирован: Oct 2011
ни кто не шарит?
P.S. программатор где ты когда ты так нужен
Сообщений: 120
Тем: 3
Зарегистрирован: Feb 2010
Репутация:
38
В той же kcaptcha искривляется только текст, а потом уже накладывается на фон
Сообщений: 981
Тем: 77
Зарегистрирован: Oct 2011
Arzamas Написал:В той же kcaptcha искривляется только текст, а потом уже накладывается на фон
да я думал об этом, но как это сделать пока не представляю. Побывал imagecopy() ,чет не вышло =(
Побывал так же наложить фон до вывода искажения, он тупо накрывает все.
Сообщений: 97
Тем: 8
Зарегистрирован: Oct 2009
Репутация:
-5
В своё время реализовал так, только надо добавить картинки и рандомно по номеру их выбирать. Получалось так:
PHP код: <?php
//Количество символов
define('CHARS', 5);
//Функция генерации произвольной строки
function generationStr()
{
$num = CHARS;
$range = '35';//$range - диапазон алфавита начиная с нуля
$chars = '1234567890aeiouybcdfghjklmnpqrstvwxz';
for($i = 0; $i < $num; $i++)
{
$str .= $chars{rand(0, $range)};
}
return $str;
}
//Открываем сессию
session_start();
//Генерируем капчу
$captcha = generationStr();
//Записываем капчу в сессию
unset($_SESSION['captcha']);
$_SESSION['captcha'] = $captcha;
//Говорим, что этот файл картинка
header('Content-type: image/jpg');
//Открываем изображение
$img = imagecreatefromjpeg('images\noise1.jpg');
//Включаем сглаживание
imageantialias($img, true);
//Генерируем путь до шрифта
$font = 'fonts\verdana.ttf';
//Добавляем текст
$x = 10;
$y = 30;
for($i = 0; $i < CHARS; $i++)
{
//Генерируем цвет
$color = imagecolorallocate($img, rand(50, 200), rand(50, 200), rand(50, 200));
$angle = rand(0, 20);
$size = rand(12, 20);
imagettftext($img, 20, $angle, $x, $y, $color, $font, $_SESSION['captcha'][$i]);
$x += 20;
}
//Отдаём изображение
imagejpeg($img, "", 90);
?>
Сообщений: 981
Тем: 77
Зарегистрирован: Oct 2011
lKingHell Написал:В своё время реализовал так, только надо добавить картинки и рандомно по номеру их выбирать. Получалось так:
PHP код: <?php
//Количество символов
define('CHARS', 5);
//Функция генерации произвольной строки
function generationStr()
{
$num = CHARS;
$range = '35';//$range - диапазон алфавита начиная с нуля
$chars = '1234567890aeiouybcdfghjklmnpqrstvwxz';
for($i = 0; $i < $num; $i++)
{
$str .= $chars{rand(0, $range)};
}
return $str;
}
//Открываем сессию
session_start();
//Генерируем капчу
$captcha = generationStr();
//Записываем капчу в сессию
unset($_SESSION['captcha']);
$_SESSION['captcha'] = $captcha;
//Говорим, что этот файл картинка
header('Content-type: image/jpg');
//Открываем изображение
$img = imagecreatefromjpeg('images\noise1.jpg');
//Включаем сглаживание
imageantialias($img, true);
//Генерируем путь до шрифта
$font = 'fonts\verdana.ttf';
//Добавляем текст
$x = 10;
$y = 30;
for($i = 0; $i < CHARS; $i++)
{
//Генерируем цвет
$color = imagecolorallocate($img, rand(50, 200), rand(50, 200), rand(50, 200));
$angle = rand(0, 20);
$size = rand(12, 20);
imagettftext($img, 20, $angle, $x, $y, $color, $font, $_SESSION['captcha'][$i]);
$x += 20;
}
//Отдаём изображение
imagejpeg($img, "", 90);
?>
так и я могу, но эту капчу можно взломать. Идеальная капча обаладет след. функциями:
1. Слепленные символы
2. Волновое искажение по x и y координатам.
3. Рандомные линии перекрывающие символы (не обязательно) - усложнит чтение символов для человека.
Сообщений: 981
Тем: 77
Зарегистрирован: Oct 2011
Решил проблему намного проще. Считываем где находятся черные пиксели (уже на искаженном изображении), и красим их в нужный нам цвет.
PHP код: <?php
//цвет фона
$background = 0xff0000;
// длина
$xx = 120;
// ширина
$yy = 60;
// заполняем черный фон, нашим цветом фона
for ($a=0; $a<$xx; $a++) {
for ($b=0; $b<$yy; $b++) {
if (imagecolorat($img2, $a, $b) == 0x000000) { imagesetpixel($img2, $a, $b, $background); }
}
}
P.S. Да но это надо делать с учетом того, что у Вас не должен под рандом попадаться черный цвет фона или шрифта, а то все замажется Это не сложно обойти:
PHP код: <?php
// все цвета на выбор, кроме черного
$background = imagecolorallocate(rand(1, 255), rand(1, 255), rand(1, 255));
Отписал, мб кому пригодиться в будущем.
|