[Guide] Создание картинки с текстом

Статус
В этой теме нельзя размещать новые ответы.

Miraage

Angular/Laravel
Регистрация
3 Июн 2008
Сообщения
231
Реакции
51
Т.к. видел посты "как это сделать?!" ловите кому надо.
Исходник: книга PHP5
PHP:
<?php ## Пример работы с TTF-шрифтом.
require_once "lib/imagettf.php";
// Выводимая строка. 
// ВНИМАНИЕ! Для отображения русских букв необходимо их
// передавать не в кодировке Windows, а в Unicode!
$string = toUnicodeEntities($myText);
// Шрифт должен лежать в папке со скриптом
$font = getcwd()."/times.ttf";
// Загружаем фоновой рисунок.
$im = imageCreateFromPng($BackgroundImage);
// Угол поворота зависит от текущего времени.
$angle = (microtime(true)*10)%360;
// Ксли хотите, чтобы текст шел из угла в угол, раскомментируйте строчку:
# $angle = rad2deg(atan2(imageSY($im), imageSX($im)));
// Подгоняем размер текста под размер изображения.
$size = imageTtfGetMaxSize(
  $angle, $font, $string, 
  imageSX($im), imageSY($im)
);
// Создаем в палитре новые цвета
$shadow = imageColorAllocate($im, 0, 0, 0);
$color  = imageColorAllocate($im, 128, 255, 0);
// Вычисляем координаты вывода, чтобы текст оказался в центре.
$sz = imageTtfSize($size, $angle, $font, $string);
$x = (imageSX($im) - $sz[0]) / 2 + $sz[2];
$y = (imageSY($im) - $sz[1]) / 2 + $sz[3];
// Рисуем строку текста, вначале черным со сдвигом, а затем - 
// основным цветом поверх (чтобы создать эффект тени).
imageTtfText($im, $size, $angle, $x+3, $y+2, $shadow, $font, $string);
imageTtfText($im, $size, $angle, $x, $y, $color, $font, $string);
// Сообщаем о том, что далее следует рисунок PNG.
Header("Content-type: image/png");
// Выводим рисунок
imagePng($im);
?>
imagettf.php
PHP:
<?php ## Библиотека полезных функций для работы с TTF.
// Исправленная функция imageTtfBBox(). Работает корректно
// даже при ненулевом угле поворота $angle (исходная функция
// при этом работает неверно).
function imageTtfBBox_fixed($size, $angle, $fontfile, $text) {
  // Вычисляем размер при НУЛЕВОМ угле поворота.
  $horiz = imageTtfBBox($size, 0, $fontfile, $text);
  // Вычисляим синус и косинус угла поворота.
  $cos = cos(deg2rad($angle));
  $sin = sin(deg2rad($angle));
  $box = array();
  // Выполняем поворот каждой координаты.
  for ($i=0; $i<7; $i+=2) {
    list ($x, $y) = array($horiz[$i], $horiz[$i+1]);
    $box[$i]   = round($x * $cos + $y * $sin);
    $box[$i+1] = round($y * $cos - $x * $sin);
  }
  return $box;
} 

// Вычисляет размеры прямоугольника с горизонтальными и вертикальными
// сторонами, в который вписан указанный текст. Результирующий массив 
// имеет структуру:
// array(
//   0  => ширина прямоугольника,
//   1  => высота прямоугольника,
//   2  => смещение начальной точки по X относительно левого верхнего
//         угла прямоугольника,
//   3  => смещение начальной точки по Y
// )
function imageTtfSize($size, $angle, $fontfile, $text) {
  // Вычисляем охкатывающий многоугольник.
  $box = imageTtfBBox_fixed($size, $angle, $fontfile, $text);
  $x = array($box[0], $box[2], $box[4], $box[6]);
  $y = array($box[1], $box[3], $box[5], $box[7]);
  // Вычисляем ширину, высоту и смещение начальной точки.
  $width  = max($x)-min($x);
  $height = max($y)-min($y);
  return array($width, $height, 0-min($x), 0-min($y));
}

// Функция возвращает наибольший размер шрифта, учитывая, что
// текст $text обязательно должен поместиться в прямоугольник
// размерами ($width, $height).
function imageTtfGetMaxSize($angle, $fontfile, $text, $width, $height) {
  $min = 1;
  $max = $height;
  while (true) {
    // Рабочий размер - среднее между максимумом и минимумом.
    $size = round(($max + $min) / 2);
    $sz = imageTtfSize($size, $angle, $fontfile, $text);
    if ($sz[0] > $width || $sz[1] > $height) {
      // Будем уменьшать максимальную ширину до те пор, пока текст не 
      // "перехлестнет" многоугольник.
      $max = $size;
    } else {
      // Наоборот, будем увеличивать минимальную, пока текст помещается. 
      $min = $size;
    }
    // Минимум и максимум сошлись друг к другу.
    if (abs($max-$min) < 2) break;
  }
  return $min;
}

// Функция преобразует текст из кодировки iso8859-5 в Unicode-entities.
// Ее необходимо вызывать перед запуском imageTtfText(), чтобы корректно 
// отображать русские буквы. Аргумент $from задает исходную кодировку
// страницы (см. convert_cyr_string() для описания значений параметра).
function toUnicodeEntities($text, $from="w") { 
  $text = convert_cyr_string($text, $from, "i");
  $uni = ""; 
  for ($i=0, $len=strlen($text); $i<$len; $i++) { 
    $char = $text{$i}; 
    $code = ord($char); 
    $uni .= ($code>175)? "&#" . (1040+($code-176)) . ";" : $char; 
  } 
  return $uni; 
} 
?>
 
это код наложения водяного знака на фото?
 
типа того.Хотя посомтрев на код скорее всего таким образом генерируются каптчи когда на картинку накладывается текст(обычно цифры)..Таким образом и счетчики работают например тот же самый liveinternet
 
для того тобы это работало нужны библиотеки gd?
 
Само собой разумеется.СЛед. раз перед тем как задать подобный вопрос зайди на сайт php.net и в 90 процентах случаев твой вопрос опадет сам собой
 
все это фигня...

Для просмотра ссылки Войди или Зарегистрируйся
вот лучшая библиотека которую я видел на GD для генерации и работой с изображениями. умеет все!
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху