PHP

Работа с изображениями

При написании этого многих приходится делать уменьшенные копии изображений, наносить определенные тексты разными цветами, прозрачностью, создавать капчу. Сегодня я расскажу Вам как это делается.
Используемый шрифт в скриптах - COMIC SANS MS(можно взять из папки WINDOWS\fonts). Надеюсь Вы им не ограничитесь

1. Начнем с создания изображения "на лету"
#PHP
<?php
$img=imagecreate(100,50); // создаем изображение с шириной 100px и высотой 50px
imagecolorallocate($img,100,100,100); // задаем фон изображения(1 аргумент - изображение, 2 - использование красного цвета, 3 - зеленого, 4 - синего. значения от 0 до 255), если не применять функцию, то фон будет черным

$text='bakler.org'; // текст, который будет нанесен на картинку
$size=15; // размер шрифта
$angle=0; // угол наклона текста
$x=10; // горизонтальная позиция начала текста
$y=30; // вертикальная позиция начала текста
$color=imagecolorallocate($img,150,150,150); // задаем цвет для вписываемого текста
imagettftext($img,$size,$angle,$x,$y,$color,'font/1.ttf',$text); // наносим текст на изображение (будьте осторожны с применением различных шрифтов. многие из них не поддерживают кириллицу!)
header("Content-type: image/gif"); // отдаем заголовок
imagegif($img); // выводим изображение(можно применять также imagepng или imagejpeg)
imagedestroy($img); // освобождаем память

Ничего сложного, попрактикуйтесь немного с цветами, рамерами, шрифтами и позициями.

2. Создание уменьшенной копии изображения с нанесением копирайта со степенью прозрачности
#PHP
<?php
// сразу предлагаю перенести код в функцию
// при использовании функции, требуется определенный объем выделяемой ОЗУ. если у вас возникнут с этим проблемы, выставите лимит: ini_set('memory_limit','30M');
function imgresize($img,$prev,$save=false,$quality=false){ // создаем функцию для измене размера изображений

$info=getimagesize($img); // получаем информацию о изображении

// далее создаем картинку в соответствии с ее типом
if($info['mime']=='image/jpeg'){
$create=imagecreatefromjpeg($img);
}elseif($info['mime']=='image/gif'){
$create=imagecreatefromgif($img);
}elseif($info['mime']=='image/png'){
$create=imagecreatefrompng($img);
}else{exit('Неподдерживаемый формат изображения');}


if($info[0]>$info[1]){$k=$info[0]/$prev;}else{$k=$info[1]/$prev;} // вычисляем какая сторона большая и задаем значение для составлении размеров нового изображения в соответствии с переданными параментрами 2 аргумента

// указываем размеры нового уменьшенного изображения
$w=intval($info[0]/$k);
$h=intval($info[1]/$k);

$img=imagecreatetruecolor($w,$h); // создаем изображение с рассчитанными размерами
imagecopyresampled($img,$create,0,0,0,0,$w,$h,$info[0],$info[1]); // уменьшаем наше исходное изображение

$size=font($w,$h); // рассчитываем размер текста, наносимого на изображение
$angle=0; // угол наклона текста
$x=strlen($_SERVER['HTTP_HOST']); // задаем горизонтальную позицию начала текста
$y=$h-($h/100*3.5); // задаем вертикальную позицию начала текста
$color=imagecolorallocatealpha($img,200,200,200,85); // задаем цвет текста и его прозрачность (85). значение можно указывать от 0 до 100
$text='bakler.org'; // наносимый текст

imagettftext($img,$size,$angle,$x,$y,$color,'font/1.ttf',$text); // наносим текст на картинку

if(!$save){ // если не переданы параметры для сохранения картинки, то отдаем заголовок
header('Content-type: '.$info['mime']);
}

if($info['mime']=='image/jpeg'){ // если картинка jpg или jpeg, то:

if($save and $quality){ // если переданы параметры(путь для сохранения и качество изображения, то сохраняем ее в пути $save с качеством $quality)
imagejpeg($img,$save,$quality);
}else{ // иначе, выводим в браузер
imagejpeg($img);
}

}elseif($info['mime']=='image/gif'){ // если картинка gif, то производятся те же операции, что и с jpg, только без применения качества

if($save){
imagegif($img,$save);
}else{
imagegif($img);
}

}elseif($info['mime']=='image/png'){ // если png, то операции аналогичны тем, что и для gif

if($save){
imagepng($img,$save);
}else{
imagepng($img);
}

}

imagedestroy($img); // освобождаем память
}

В коде была использована функция font(). Что же она делает? Она вычисляет размер шрифта наносимого на картинку в соответствии с переданными размерами изображения. Рассмотрим ее.
#PHP
<?php
function font($x,$y){ // создаем функцию

if($x>=2048 or $y>=1024){ // если ширина или высота картинки больше 1024px, то функция возвращает размер шрифта 128. Аналогичные операции производятся ниже
return 128;
}elseif($x>=1024 or $y>=512){
return 64;
}elseif($x>=512 or $y>=256){
return 32;
}elseif($x>=256 or $y>=128){
return 16;
}else{
return 8;
}

}

Теперь о применении функции.
#PHP
<?php
imgresize('123.jpg',150); // выведет картинку в браузер со стороной 150px
imgresize('123.jpg',200,'/resize/1.jpg',100); // сохранит картинку в папке resize под именем 1.jpg с качеством 100 и размером стороны 200
// для gif и png 4 аргумент не применяется




4. Создание капчи
Создаем файл img.php с содержимым:
#PHP
<?php
session_start();
$_SESSION['code']=''; // создаем пустой элемент массива в сессии
$gen=5; // кол-во символов на капче
$width=110; // ширина капчи
$height=40; // высота капчи
$code=array('a', 'b', 'c', 'd', 'e', 'f', 'h', 'k', 'm', 'n', 'o', 'r', 's', 't', 'u', 'v', 'w', 'x', 'z', 1, 2, 3, 4, 5, 6, 7, 8, 9, 0); // генерируем символы, используемые в капче(специально убраны символы с хвостами)
$min=20; // минимальный размер шрифта
$max=30; // максимальный размер шрифта
$ras=19; // расстояние между символами
$posit=$ras*1.3; // средняя вертикальная позиция текста на капче
$sangle=20; // средний угол наклона
$pixel=30; // загрязнение пикселями
$c=sizeof($code)-1; // считаем размер массива с символами
for($i=0;$i<$gen;$i++){
$_SESSION['code'].=$code[mt_rand(0,$c)]; // заносим в сессию символы
}

$img=imagecreate($width,$height); // создаем изображение
imagecolorallocate($img, mt_rand(0,50), mt_rand(0,50), mt_rand(0,50)); // генерируем случайный цвет фона

for($i=0;$i<3;$i++){ // наносим подтекстовое загрязнение
$cx=mt_rand(1,$width); // горизонтальная позиция начала эллипса
$cy=mt_rand(1,$height); // вертикальная позиция начала эллипса
$x=mt_rand(1,$width); // ширина эллипса
$y=mt_rand(1,$height); // высота эллипса
$e=mt_rand(0,360); // заполнение по градусам
$color=imagecolorallocate($img, mt_rand(0,150), mt_rand(0,150), mt_rand(0,150)); // цвет эллипса
imagefilledarc($img,$cx,$cy,$x,$y,$e,1,$color,IMG_ARC_EDGED); // рисуем эллипсы под текстом
// IMG_ARC_PIE и IMG_ARC_CHORD взаимоисключающи; IMG_ARC_CHORD просто соединяет начальный и конечный углы прямой линией, а IMG_ARC_PIE даёт округлый край. IMG_ARC_NOFILL указывает, что должна быть вычерчена дуга или хорда без заполнения. IMG_ARC_EDGED, использованная вместе с IMG_ARC_NOFILL, указывает, что начальный и конечный углы должны быть соединены с центром - это хороший способ вычертить (но не заполнить) 'pie slice/слоёный пирог'.
}

for($i=0;$i<$gen;$i++){ // наносим код
$size=mt_rand($min,$max); // размер шрифта
$angle=mt_rand(-$sangle,$sangle); // угол наклона текста
$x=$ras/2+$ras*$i; // горизонтальная позиция начала текста
$y=mt_rand($posit/1.3,$posit*1.3); // вертикальная позиция начала текста
$color=imagecolorallocate($img, mt_rand(150,255), mt_rand(150,255), mt_rand(150,255)); // цвет кода
imagettftext($img, $size, $angle, $x, $y, $color, 'font/1.ttf', mb_substr($_SESSION['code'],$i,1));
}

for($i=0;$i<$pixel;$i++){ // загрязнение пикселями и линиями

$y=mt_rand(1,$height); // вертикальная позиция пикселя
$x=mt_rand(1,$width); // горизонтальная позиция пикселя
$color=imagecolorallocate($img, mt_rand(150,255), mt_rand(150,255), mt_rand(150,255)); // цвет пикселя
imagesetpixel($img,$x,$y,$color); // наносим пиксель

// дальше наносим линии
if(is_int($i/3)){ // рисуем линии тогда, когда $i ровно делится на 3
$x1=mt_rand(1,$width); // начальная горизонтальная позиция линии
$y1=mt_rand(1,$width); // начальная вертикальная позиция линии
$x2=mt_rand(1,$width); // конечная горизонтальная позиция линии
$y2=mt_rand(1,$width); // конечная вертикальная позиция линии
$color=imagecolorallocate($img, mt_rand(0,150), mt_rand(0,150), mt_rand(0,150)); // цвет линии

for($j=0;$j<2;$j++){
imageline($img,$x1+$j,$y1+$j,$x2+$j,$y2+$j,$color); // рисуем линии
}
}

}

header("Content-type: image/gif"); // отдаем заголовок
imagegif($img); // выводим картинку
imagedestroy($img); // освобождаем память

Создаем файл 2.php с содержимым:
#HTML
<form action="2.php" method="post">
<img src="img.php?<?php echo rand() ?>" alt="." />
<input name="code" type="text" />
<input type="submit"value="Проверить" />
</form>

И последний файл с проверкой кода - 3.php с содержимым:
#PHP
<?php
session_start();
if(!empty($_POST)){ // проверяем наличие POST запроса
if(!empty($_POST['code']) and isset($_SESSION['code']) and $_POST['code']==$_SESSION['code']){ // сверяем переменную из $_POST и из $_SESSION и выводим результат
echo 'Капча пройдена';
}else{
echo 'Код введен неверно';
}
unset($_SESSION['code']); // обязательно удаляем элемент сессии

// дальнейшие операции...
}

Добавлено: 19 Августа 2013 11:07:05 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...