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

Тема в разделе "PHP", создана пользователем Miraage, 18 июл 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Miraage

    Miraage Angular/Laravel

    Регистр.:
    3 июн 2008
    Сообщения:
    230
    Симпатии:
    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($im000);
    $color  imageColorAllocate($im1282550);
    // Вычисляем координаты вывода, чтобы текст оказался в центре.
    $sz imageTtfSize($size$angle$font$string);
    $x = (imageSX($im) - $sz[0]) / $sz[2];
    $y = (imageSY($im) - $sz[1]) / $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($size0$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$height0-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

    ?>
     
    Tapak нравится это.
  2. toxito

    toxito

    Регистр.:
    1 июн 2008
    Сообщения:
    150
    Симпатии:
    10
    это код наложения водяного знака на фото?
     
  3. timati

    timati Постоялец

    Регистр.:
    14 июл 2008
    Сообщения:
    134
    Симпатии:
    13
    типа того.Хотя посомтрев на код скорее всего таким образом генерируются каптчи когда на картинку накладывается текст(обычно цифры)..Таким образом и счетчики работают например тот же самый liveinternet
     
  4. Chisel

    Chisel Писатель

    Регистр.:
    16 июл 2008
    Сообщения:
    5
    Симпатии:
    0
    для того тобы это работало нужны библиотеки gd?
     
  5. timati

    timati Постоялец

    Регистр.:
    14 июл 2008
    Сообщения:
    134
    Симпатии:
    13
    Само собой разумеется.СЛед. раз перед тем как задать подобный вопрос зайди на сайт php.net и в 90 процентах случаев твой вопрос опадет сам собой
     
  6. bratok

    bratok

    Регистр.:
    16 ноя 2006
    Сообщения:
    203
    Симпатии:
    47
    все это фигня...

    http://www.verot.net/php_class_upload_samples.htm
    вот лучшая библиотека которую я видел на GD для генерации и работой с изображениями. умеет все!
     
Статус темы:
Закрыта.