Всем привет.
<?php
class ttfTextOnImage
{
// Качество jpg по-умолчанияю
public $jpegQuality = 100;
// Каталог шрифтов
public $ttfFontDir = 'ttf';
private $ttfFont = false;
private $ttfFontSize = false;
private $hImage = false;
private $hColor = false;
public function __construct($imagePath)
{
if (!is_file($imagePath) || !list(,,$type) = @getimagesize($imagePath)) return false;
switch ($type)
{
case 1: $this->hImage = @imagecreatefromgif($imagePath); break;
case 2: $this->hImage = @imagecreatefromjpeg($imagePath); break;
case 3: $this->hImage = @imagecreatefrompng($imagePath); break;
default: $this->hImage = false;
}
}
public function __destruct()
{
if ($this->hImage) imagedestroy($this->hImage);
}
/**
* Устанавливает шрифт
*
*/
public function setFont($font, $size = 14, $color = false, $alpha = false)
{
if (!is_file($font) && !is_file($font = $this->ttfFontDir.'/'.$font))
return false;
$this->ttfFont = $font;
$this->ttfFontSize = $size;
if ($color) $this->setColor($color, $alpha);
}
/**
* Пишет текст
*
*/
public function writeText ($x, $y, $text, $angle = 0)
{
if (!$this->ttfFont || !$this->hImage || !$this->hColor) return false;
imagettftext(
$this->hImage,
$this->ttfFontSize, $angle, $x, $y + $this->ttfFontSize,
$this->hColor, $this->ttfFont, $text);
}
/**
* Форматирует текст (согласно текущему установленному шрифту),
* что бы он не вылезал за рамки ($bWidth, $bHeight)
* Убирает слишком длинные слова
*/
public function textFormat($bWidth, $bHeight, $text)
{
// Если в строке есть длинные слова, разбиваем их на более короткие
// Разбиваем текст по строкам
$strings = explode("\n",
preg_replace('!([^\s]{24})[^\s]!su', '\\1 ',
str_replace(array("\r", "\t"),array("\n", ' '), $text)));
$textOut = array(0 => '');
$i = 0;
foreach ($strings as $str)
{
// Уничтожаем совокупности пробелов, разбиваем по словам
$words = array_filter(explode(' ', $str));
foreach ($words as $word)
{
// Какие параметры у текста в строке?
$sizes = imagettfbbox($this->ttfFontSize, 0, $this->ttfFont, $textOut[$i].$word.' ');
// Если размер линии превышает заданный, принудительно
// перескакиваем на следующую строку
// Иначе пишем на этой же строке
if ($sizes[2] > $bWidth) $textOut[++$i] = $word.' '; else $textOut[$i].= $word.' ';
// Если вышли за границы текста по вертикали, то заканчиваем
if ($i*$this->ttfFontSize >= $bHeight) break(2);
}
// "Естественный" переход на новую строку
$textOut[++$i] = ''; if ($i*$this->ttfFontSize >= $bHeight) break;
}
return implode ("\n", $textOut);
}
/**
* Устанваливет цвет вида #34dc12
*
*/
public function setColor($color, $alpha = false)
{
if (!$this->hImage) return false;
list($r, $g, $b) = array_map('hexdec', str_split(ltrim($color, '#'), 2));
return $alpha === false ?
$this->hColor = imagecolorallocate($this->hImage, $r+1, $g+1, $b+1) :
$this->hColor = imagecolorallocatealpha($this->hImage, $r+1, $g+1, $b+1, $alpha);
}
/**
* Выводит картинку в файл. Тип вывода определяется из расширения.
*
*/
public function output ($target, $replace = true)
{
if (is_file ($target) && !$replace) return false;
$ext = strtolower(substr($target, strrpos($target, ".") + 1));
switch ($ext)
{
case "gif":
imagegif ($this->hImage, $target);
break;
case "jpg" :
case "jpeg":
imagejpeg($this->hImage, $target, $this->jpegQuality);
break;
case "png":
imagepng($this->hImage, $target);
break;
default: return false;
}
return true;
}
}
// Берем какую-нибудь картинку
$ttfImg = new ttfTextOnImage('images/007.jpg');
// Пишем шрифтом Scrawn размером 64 пункта бордовым цветом с 80%-ой прозрачностью
$ttfImg->setFont('Fut.ttf', 64, "#000000", 0);
$ttfImg->writeText(40, 570, "Happy halloween!");
// Шрифтом Constantin размером 15 пунктов оранжевым цветом с 90%-ой прозрачностью
$ttfImg->setFont('Fut.ttf', 15, "#003153", 0);
// Хотим написать много, поэтому сначала отформатируем наш текст
$message = $ttfImg->textFormat(400, 570,
"Хеллоуин (англ. Halloween) — преимущественно американский праздник, празднуется в ночь с 31 октября на 1 ноября.
Также упоминается как «канун Дня всех святых». Праздник корнями уходит к старинному кельтскому празднеству Самайн.");
// Пишем (чуть-чуть наклоним)
$ttfImg->writeText(40, 100, $message, 0);
// и вывод в файл
$ttfImg->output('images/007.jpg');
?>
Есть код, который берет из папки изображение, накладывает на него текст, и сохраняет полученный результат.
Как сделать, чтобы код брал изображение из загрузчика изображения в топике фотосете, а текст из описания к фото и пересохранял изображение?