Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Текст на картинке. 
:(
    Опции темы
SultanOFF
Дата 2.7.2012, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Доброго времени суток товарищи. Появилась необходимость написать текст на картинку. Использую класс, который нашел на хабре:
Код

<?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('1.jpg');
$ttfImg->setFont('fonts/times.ttf', 64, "#800000", 80);      
$ttfImg->writeText(40, 570, "Hello world!");
$ttfImg->output('images/postcard.jpg');

В результате:
в папке images появляется файл postcard.jpg, но без надписи. Почему так?
PM MAIL   Вверх
MoLeX
Дата 2.7.2012, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



а шрифт то есть?


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
SultanOFF
Дата 2.7.2012, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



шрифт times.ttf положил в папку fonts, которая лежит на том же уровне, что и скрипт
PM MAIL   Вверх
MoLeX
Дата 2.7.2012, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Код

var_dump($ttfImg->setFont('fonts/times.ttf', 64, "#800000", 80));



--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
SultanOFF
Дата 2.7.2012, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



выдало ответ NULL, почему так?
PM MAIL   Вверх
krypt3r
Дата 2.7.2012, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: 3
Всего: 16



NULL потому что setFont ничего не возвращает, если нет ошибок. А у вас исходная картинка каких размеров? Попробуйте для проверки координаты уменьшить, скажем, до x=10, y=10, и уменьшить шрифт до приемлемых размеров
PM MAIL   Вверх
SultanOFF
Дата 2.7.2012, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



получилось. Видимо размер шрифта был слишком большой! Спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0681 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.