
Представляю вашему вниманию не большой, но в тоже время достаточно богатый возможностями класс (на основе GD) написания текста на картинках TrueType-шрифтами.
Это может пригодиться в огромной ряде случаев.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
<?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; } } ?> |
Что он умеет, думаю разобраться не сложно, тем более что комментарии есть. Теперь пример использования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// Берем какую-нибудь картинку $ttfImg = new ttfTextOnImage('images/hlwn.jpg'); // Пишем шрифтом Scrawn размером 64 пункта бордовым цветом с 80%-ой прозрачностью $ttfImg->setFont('files/fonts/scra.ttf', 64, "#800000", 80); $ttfImg->writeText(40, 570, "Happy halloween!"); // Шрифтом Constantin размером 15 пунктов оранжевым цветом с 90%-ой прозрачностью $ttfImg->setFont('files/fonts/constan.ttf', 15, "#ff8200", 90); // Хотим написать много, поэтому сначала отформатируем наш текст $message = $ttfImg->textFormat(400, 500, "Хеллоуин (англ. Halloween) — преимущественно американский праздник, празднуется в ночь с 31 октября на 1 ноября. Также упоминается как «канун Дня всех святых». Праздник корнями уходит к старинному кельтскому празднеству Самайн."); // Пишем (чуть-чуть наклоним) $ttfImg->writeText(40, 100, $message, 5); // и вывод в файл $ttfImg->output('images/postcard.jpg'); |
Ну собственно и результат:
Ну и на последок возможности применения:
1. Написать что-нибудь на картинке (подпись свою например)
2. Делать «гламурные заголовки» — когда некоторые тексты делаются красивыми картинками (в вордпрессе такое есть вроде)
3. CAPТCHA (просто нужно взять очень сложно читаемый шрифт)
Пользуйтесь на здоровье!
PS: Расчитано на кодировку UTF-8.
Follow to steps below to protect unwanted shopping on android spying.ninja/