Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
imagecreatetruecolor()
#1
imagecreatetruecolor() - создаёт новое изображение true color. озвращает идентификатор чёрно-белого изображения размером x_size на y_size. Собственно как можно сменить фон? При волновом искажении изображения, получаются черные края.
Ответ
#2
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);
?>
Ответ
#3
Да, капчу. Все сделал, 1 косяк остался вот. Спс.

Добавлено через 4 минуты
Хмм, принцип понятен, но что-то все так же осталось.

Я понял, вообщем прямоугольник тоже искажаться. Мне надо как-то игнорировать этот момент, ничего в голову не лезет. Или сделать обратное искажение...

P.S. вместео прямоугольника тогда уже легче сделать заливку фона:
imagefill ($img, 0, 0, 0xf9e3e7);

Добавлено через 22 часа 29 минут
Для ясности, вот что происходит:
[Изображение: e1e54c5e3579.png]
Ответ
#4
ни кто не шарит? Sad

P.S. программатор где ты когда ты так нужен Smile
Ответ
#5
В той же kcaptcha искривляется только текст, а потом уже накладывается на фон
Ответ
#6
Arzamas Написал:В той же kcaptcha искривляется только текст, а потом уже накладывается на фон

да я думал об этом, но как это сделать пока не представляю. Побывал imagecopy() ,чет не вышло =(

Побывал так же наложить фон до вывода искажения, он тупо накрывает все.
Ответ
#7
В своё время реализовал так, только надо добавить картинки и рандомно по номеру их выбирать. Получалось так:[Изображение: d6a1c5e54ec2.jpg]
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);

?>
[Изображение: master.gif]
Ответ
#8
lKingHell Написал:В своё время реализовал так, только надо добавить картинки и рандомно по номеру их выбирать. Получалось так:[Изображение: d6a1c5e54ec2.jpg]
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. Рандомные линии перекрывающие символы (не обязательно) - усложнит чтение символов для человека.
Ответ
#9
Решил проблему намного проще. Считываем где находятся черные пиксели (уже на искаженном изображении), и красим их в нужный нам цвет.

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. Да но это надо делать с учетом того, что у Вас не должен под рандом попадаться черный цвет фона или шрифта, а то все замажется Smile Это не сложно обойти:

PHP код:
<?php 
// все цвета на выбор, кроме черного
$background = imagecolorallocate(rand(1, 255), rand(1, 255), rand(1, 255));

Отписал, мб кому пригодиться в будущем.
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 2 Гость(ей)